gdb本身只支持ASCII, ISO-8859-1,set charset可以查看。直接print utf8的中文字符会出现乱码,
看到网上有个解决方法是在调试程序中加入一个打印的函数,感觉比较好用,分享
一下。
将如下代码和main函数放在一起,调试的时候 call pstring(s)就行。
void pstring(string& s) { for (int i = 0; i < s.length(); i ++){ int len = 0; if(s[i] < 0) {// multi-bytes utf-8 stream unsigned char h = static_cast<unsigned char>(s[i]); if(h >> 4 == 0x0E) len = 3; // 1110XXXX 10XXXXXX 10XXXXXX if(h >> 5 == 0x06) len = 2; // 110XXXXX 10XXXXXX if(h >> 3 == 0x1E) len = 4; // 11110XXX 10XXXXXX 10XXXXXX 10XXXXXX if(h >> 2 == 0x3E) len = 5; // 111110xx 10XXXXXX 10XXXXXX 10XXXXXX10XXXXXX if(h >> 1 == 0x7E) len = 6; // 1111110x 10XXXXXX 10XXXXXX 10XXXXXX10XXXXXX 10XXXXXX } else if (s[i] == 0) return; else len = 1; // ascii, 0XXXXXXX string tmp = s.substr(i,len); tmp += "/0"; cout<<tmp; } cout<<'/n'; fflush(stdout); }
void pstring(char * str) { string s=str; for (int i = 0; i < s.length(); i ++){ int len = 0; if(s[i] < 0) {// multi-bytes utf-8 stream unsigned char h = static_cast<unsigned char>(s[i]); if(h >> 4 == 0x0E) len = 3; // 1110XXXX 10XXXXXX 10XXXXXX if(h >> 5 == 0x06) len = 2; // 110XXXXX 10XXXXXX if(h >> 3 == 0x1E) len = 4; // 11110XXX 10XXXXXX 10XXXXXX 10XXXXXX if(h >> 2 == 0x3E) len = 5; // 111110xx 10XXXXXX 10XXXXXX 10XXXXXX10XXXXXX if(h >> 1 == 0x7E) len = 6; // 1111110x 10XXXXXX 10XXXXXX 10XXXXXX10XXXXXX 10XXXXXX } else if (s[i] == 0) return; else len = 1; // ascii, 0XXXXXXX string tmp = s.substr(i,len); tmp += "/0"; cout<<tmp; } cout<<'/n'; fflush(stdout); }