GDB 调试技巧
约定:$开始的行为shell下的命令
在linux中可以中可以通过:
$ gdb file_name --core=core.222
注意:
这里的`file_name`是一个可执行文件比如:`/usr/local/rss/bin/nms_monitor` 然后使用`where` 或者`bt`或者`info stack` 或者`backtrace` 即可看到调用堆栈; `frame n` 查看具体的那个调用堆栈` up (down)`进行前进或者后退
- 在其他机器上可以使用
$ pstack core.22
- gdb在某个文件设定断点
1
(gdb) b test.cpp:2234
2234为需要设置断点的行数1
(gdb)b test.cpp:snmp_modify_table
在test.cpp文件的snmp_modify_table
函数入口处设置断点
- 在类成员函数设置断点:
1
(gdb) b A::print_log
如果不知道类成员可以通过以下方法查看类成员:1
(gdb)b A::<tab>
gdb查看断点情况:
1
(gdb)info break
取消断点dis + 断点编号
1
(gdb)dis 1
查看类的某个成员:(前面是字母L)
1
(gdb)l A::print_log
回车继续翻页
打印当前变量值
1
(gdb)print 变量名
查看函数调用栈,函数调用情况
1
(gdb) bt
查看进程内存映像
(gdb)info proc mappings- 查看进程镜像中heap的内容 :
1
2
3(gdb)set height 0 #设置高位为0,打印日志时可以持续输出
(gdb)set logging on #打开日志
(gdb)x/10a 0x0009123
输入的日志在gdb.txt 可以结合c++filt 分析heap中的内容,如果类对象有虚函数,那么new的对象如果没有free掉将会在heap中保留
根据该特点可以用于分析内存泄漏。