在GDB中查看 C/C++ Unicode文本变量内容(wchar_t*)
2007-12-19 12:36
716 查看
GDB(The GNU Project Debugger)中的 print 命令不支持查看 C/C++ Unicode文本变量的内容(wchar_t*)。
假设我们要调试以下 C/C++ 代码:
#include <wchar.h>
int main()
{
const char* szAnsi = "The EF programming language is a general-purpose, simple, easy to use, "
"efficient, practical, object-oriented and cross-platform language. ";
const wchar_t* szUnicode = L"“易语言.飞扬”是一门简单易学、高效实用、面向对象、跨平台的计算机通用编程语言。";
return 0;
}
在第 8 行(return 0;)中断后,可以用 print 命令显示出 const char* 变量 szAnsi 中的文本内容,但却无法显示 const wchar_t* 变量 szUnicode 中的文本内容:
从上面的执行结果可以看到,print 只能显示出 wchar_t* 文本变量的地址,并不直接显示出其中的文本内容,甚至连单个Unicode字符也显示不出来(只显示Unicode代码)。这个就比较讨厌了。
在实际调试工作中,迫切需要直接查看Unicode文本变量的内容。我们给出的解决方案是,通过 .gdbinit 文件给 GDB 增加一个 wprint 命令,用于显示 wchar_t* 变量值。
主要实现原理是,先将Unicode文本内容存储到一个临时文件中,然后调用另外一个程序读取文件内容并显示出来。
具体操作方法如下:
首先,请将以下内容存储为 ~/.gdbinit 文件,或添加到原有文件中:
define wprint
set $fd = open("/tmp/dywt.gdb.wprint", 577)
set $x = write($fd, $arg0, wcslen($arg0) * sizeof(wchar_t))
set $y = close($fd)
shell dywt.gdb.wprint
end
document wprint
print the content of unicode text variable (wchar_t*)
for example: wprint unicode_text_var_name
end
其中,我们调用了一个外部可执行程序,dywt.gdb.wprint,其 C/C++ 源代码如下:
#include <stdio.h>
#include <memory.h>
#include <stdlib.h>
#include <locale.h>
int main()
{
setlocale(LC_ALL, "");
const char* file_name = "/tmp/dywt.gdb.wprint";
FILE* f = fopen(file_name, "rb");
if(f == 0)
{
printf("Open '%s' error! ", file_name);
return -1;
}
fseek(f, 0, SEEK_END);
long file_size = ftell(f) + 1;
fseek(f, 0, SEEK_SET);
wchar_t* buf = (wchar_t*)malloc(file_size + sizeof(wchar_t));
int r = fread(buf, 1, file_size, f);
buf[file_size / sizeof(wchar_t)] = 0;
printf("%S ", buf);
free(buf);
}
将以上代码编译为可执行程序 dywt.gdb.wprint,复制到 /usr/bin 目录下即可。
(注:以上实现中,好象不能省略临时文件 /tmp/dywt.gdb.wprint。GDB中的 $var 采用文本替换机制,即,如果把 $arg0 当作参数传递给 dywt.gdb.wprint,实际接收到的是文本 "$arg0" 。)
实际使用中,wprint 用法与 print 完全相同:
以上是在实践中摸索出来的方法,不敢私藏,特拿出来与大家分享。应该还有更好的解决方案,我们暂时没有发现而已,期待高人指点。
假设我们要调试以下 C/C++ 代码:
#include <wchar.h>
int main()
{
const char* szAnsi = "The EF programming language is a general-purpose, simple, easy to use, "
"efficient, practical, object-oriented and cross-platform language. ";
const wchar_t* szUnicode = L"“易语言.飞扬”是一门简单易学、高效实用、面向对象、跨平台的计算机通用编程语言。";
return 0;
}
在第 8 行(return 0;)中断后,可以用 print 命令显示出 const char* 变量 szAnsi 中的文本内容,但却无法显示 const wchar_t* 变量 szUnicode 中的文本内容:
(gdb) b 8 Breakpoint 1 at 0x80880e3: file test.cpp, line 8. (gdb) r Starting program: /home/dywt/test Breakpoint 1, main () at test.cpp:8 8 return 0; (gdb) print szAnsi $1 = 0x80881cc "The EF programming language is a general-purpose, simple, easy to use, efficient, practical, object-oriented and cross-platform language. " (gdb) print szUnicode $2 = (const wchar_t *) 0x8088258 (gdb) print szUnicode[0] $3 = 8220 |
在实际调试工作中,迫切需要直接查看Unicode文本变量的内容。我们给出的解决方案是,通过 .gdbinit 文件给 GDB 增加一个 wprint 命令,用于显示 wchar_t* 变量值。
主要实现原理是,先将Unicode文本内容存储到一个临时文件中,然后调用另外一个程序读取文件内容并显示出来。
具体操作方法如下:
首先,请将以下内容存储为 ~/.gdbinit 文件,或添加到原有文件中:
define wprint
set $fd = open("/tmp/dywt.gdb.wprint", 577)
set $x = write($fd, $arg0, wcslen($arg0) * sizeof(wchar_t))
set $y = close($fd)
shell dywt.gdb.wprint
end
document wprint
print the content of unicode text variable (wchar_t*)
for example: wprint unicode_text_var_name
end
其中,我们调用了一个外部可执行程序,dywt.gdb.wprint,其 C/C++ 源代码如下:
#include <stdio.h>
#include <memory.h>
#include <stdlib.h>
#include <locale.h>
int main()
{
setlocale(LC_ALL, "");
const char* file_name = "/tmp/dywt.gdb.wprint";
FILE* f = fopen(file_name, "rb");
if(f == 0)
{
printf("Open '%s' error! ", file_name);
return -1;
}
fseek(f, 0, SEEK_END);
long file_size = ftell(f) + 1;
fseek(f, 0, SEEK_SET);
wchar_t* buf = (wchar_t*)malloc(file_size + sizeof(wchar_t));
int r = fread(buf, 1, file_size, f);
buf[file_size / sizeof(wchar_t)] = 0;
printf("%S ", buf);
free(buf);
}
将以上代码编译为可执行程序 dywt.gdb.wprint,复制到 /usr/bin 目录下即可。
(注:以上实现中,好象不能省略临时文件 /tmp/dywt.gdb.wprint。GDB中的 $var 采用文本替换机制,即,如果把 $arg0 当作参数传递给 dywt.gdb.wprint,实际接收到的是文本 "$arg0" 。)
实际使用中,wprint 用法与 print 完全相同:
(gdb) print szAnsi $1 = 0x80881cc "The EF programming language is a general-purpose, simple, easy to use, efficient, practical, object-oriented and cross-platform language. " (gdb) wprint szUnicode “易语言.飞扬”是一门简单易学、高效实用、面向对象、跨平台的计算机通用编程语言。 |
相关文章推荐
- 在GDB中查看 C/C++ Unicode文本变量内容(wchar_t*)
- 在GDB中查看Unicode文本变量内容(wchar_t*)
- gdb 查看c++中stl的内容
- 让GDB支持查看C++ STL的内容
- gdb脚本 - 查看stl变量
- [摘]gdb查看QString类型变量
- pycharm下如何查看python的变量类型和变量内容
- gdb 查看vector, list, map 内容
- 深入理解c++中char*与wchar_t*与string以及wstring之间的相互转换
- 用gdb如何查看指定地址的内存内容?
- gdb调试进阶之查看指定内存中的内容
- [SHELL]:查看文本内容的命令:head,tail
- 用C++读写unicode文本
- GDB查看变量
- [C++] gdb里查看errno
- C++用typeid查看变量类型
- 1.a.txt 文本里面写有如下内容: age=25:name=张三 age=26:name=李四 。。。。 已知:age和name,是Person类的两个成员变量,请把这个文本里面的
- c/c++创建并读取文本文件内容
- 也谈C++中char*与wchar_t*之间的转换
- [转] gdb 查看vector, list, map 内容