info threads 显示当前可调试的所有线程,每个线程会有一个GDB为其分配的ID,后面操作线程的时候会用到这个ID。 前面有*的是当前调试的线程。
thread ID 切换当前调试的线程为指定ID的线程。
break thread_test.c:123 thread all 在所有线程中相应的行上设置断点
thread apply ID1 ID2 command 让一个或者多个线程执行GDB命令command。
thread apply all command 让所有被调试线程执行GDB命令command。
set scheduler-locking off|on|step 估计是实际使用过多线程调试的人都可以发现,在使用step或者continue命令调试当前被调试线程的时候,其他线程也是同时执行的,怎么只让被调试程序执行呢?通过这个命令就可以实现这个需求。off 不锁定任何线程,也就是所有线程都执行,这是默认值。 on 只有当前被调试程序会执行。 step 在单步的时候,除了next过一个函数的情况(熟悉情况的人可能知道,这其实是一个设置断点然后continue的行为)以外,只有当前线程会执行。gdb土办法调多线程,发个信号让进程stop住,然后gdb进去看看每个线程的backtrace,然后再让进程继续跑,再取样,多次取样看看哪个地方出现最多。
info symbol 0x807a505 : 查看当前内存地址0x807a505所指向的函数符号,此命令对查看 回调函数指针所指向的具体函数名 非常方便。
info f 更相信的显示当前栈信息
调试的跳步解决:
是qt或者gdb调试的时候发现代码的执行总是跳来跳去的,这是因为编译的时候加入了优化选项。修改configure,把里面的所有 O2 都去掉,再编译、调试,既可解决此问题或者 gcc 输出改为-O
gdb 查看结构体
set print pretty on //设定美化显示过程
ptype p_type 或者pt p_type打印结构体的定义
p *p_type 打印结构体中变量值, p p_type->a 查看结构体中成员值
whatis p_type 打印p_type类型
如用p ((struct NewStruct *)tmp_p)->a 出现
no struct type named NewStruct
需在编译时加 -fno-eliminate-unused-debug-types 选项
1)gdb app
(gdb) core-file core
2)gdb -c core app
3) gdb ./exe app
而其中第二种方法在某些系统上也是不好用的,所以就用第一种即可。
gdb 调式动态库:
需在动态库编译的时候加上-g 选项, 同时主程序也在编译时加-g选项, gdb进入时先在mian函数处打断点, 再在动态库函数处打断点
用s命令便可调试进动态连接库内部, 若看见的是调用的什么库, 可list *地址查看文件函数