在debug模式下,使用GDB进行调试,可以使用的命令汇总如下:
(gdb) p *(*pHead)->next 这里声明语句ListNode** pHead,表示查看*pHead执行链表节点的next域的指针
(gdb) bt full 相比bt能显示更详细的局部变量信息
(gdb) b hookfactory.cpp:173 在源文件指定行数处加断点
(gdb) b main.cpp:MURLProc 在源文件指定函数处加断点
(gdb) b CHttpClient::initialize() 在指定类名的成员函数处加断点
(gdb) l 直接在当前stack frame中查看当前函数的代码,比较直观
(gdb) info b 列出所有断点信息,包括Address,Type,description
(gdb) disa 1 禁用断点
(gdb) info b[1] 列出第一个断点的信息
(gdb) delete all 删除所有断点信息
(gdb) frame 8 or f8 查看第8层栈帧的函数调用,包括其中的局部变量
(gdb) set print elements 0 设置打印完整字符串信息,不然,未打印出的字符串会显示“...”符号
(gdb) p *(CModuleInfo *)gMainConfig.modules[i] 查看复杂的结构体信息
(gdb) p *obj.m_alt 正常显示结构体的信息
(gdb) p info->m_ua_req_hdr.length() 计算函数表达式
$9 = 342
(gdb) p *this 打印当前对象中各成员的值
(gdb) p this->f 打印出指定成员f的内部信息
(gdb) p *(char *)p 对void*类型的指针p,转换类型后查看它的地址,使用p *p会出错
(gdb) f 打印函数
(gdb) set print pretty on 以整洁的格式显示,而非显示一整行
(gdb) p so 将类或结构体so以排列好的格式打印出来,比如
$2 = {
num = 0,
link = {
next=0x400530
}
}
(gdb) set print element 0 完整显示字符串的值,没有省略号...
在gdb环境中按快捷键cTRL + X + A,弹出源码窗口,再次按该组合键后恢复原状.
下面是补充:
1. 调试core dump文件时,可以用frame查看堆栈的某个位置(当然gdb调试也可以)。这样可以看到其他位置的变量,而不仅仅是出错的那个地方。
2. 自定义函数,譬如我需要频繁的执行c然后bt,可以定义个函数:
[plain] view plaincopy
- (gdb) define doit
- >c
- >bt
- >end
- 然后执行这个函数就好了:
- (gdb) doit
- 然后不断回车就可以了。
3.可以用x查看内存信息,譬如查看128个字节:x /128xb data_ptr,可以看到指针data_ptr的128个字节的内存信息。
Here is an example. If a program says
int *array = (int *) malloc (len * sizeof (int));
you can print the contents of array with
p *array@len
4.gdb里设置临时变量
使用 set 命令。
(gdb) set $i="hello"
(gdb) ptype $i
type = char [6]
(gdb) set $i=1
(gdb) ptype $i
type = int
(gdb) set $i=(char)1
(gdb) ptype $i
type = char
(gdb) set $i=(short)1
(gdb) ptype $i
type = short