gdb_调试

GDB 调试技巧

约定:$开始的行为shell下的命令

  1. 在linux中可以中可以通过:
    $ gdb file_name --core=core.222

    注意:

    这里的`file_name`是一个可执行文件比如:`/usr/local/rss/bin/nms_monitor`
    然后使用`where` 或者`bt`或者`info stack` 或者`backtrace` 即可看到调用堆栈;
    `frame n` 查看具体的那个调用堆栈` up (down)`进行前进或者后退
    
  2. 在其他机器上可以使用
    $ pstack core.22
  3. gdb在某个文件设定断点
    1
    (gdb) b test.cpp:2234

2234为需要设置断点的行数

1
(gdb)b test.cpp:snmp_modify_table

在test.cpp文件的snmp_modify_table函数入口处设置断点

  1. 在类成员函数设置断点:
    1
    (gdb) b A::print_log

如果不知道类成员可以通过以下方法查看类成员:

1
(gdb)b A::<tab>

  1. gdb查看断点情况:

    1
    (gdb)info break
  2. 取消断点dis + 断点编号

    1
    (gdb)dis  1
  3. 查看类的某个成员:(前面是字母L)

    1
    (gdb)l A::print_log

回车继续翻页

  1. 打印当前变量值

    1
    (gdb)print 变量名
  2. 查看函数调用栈,函数调用情况

    1
    (gdb) bt
  3. 查看进程内存映像
    (gdb)info proc mappings

  4. 查看进程镜像中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中保留
根据该特点可以用于分析内存泄漏。

坚持原创技术分享,您的支持奖鼓励我继续创作!