gdb调试
来源:互联网 发布:logo自动设计软件 编辑:程序博客网 时间:2024/05/22 17:16
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 更相信的显示当前栈信息
list 38 查看38行代码周围的十行, 即33-42
list - 查看上一个命令查看的前十行及23-32
list main 查看main函数周围10行
list main.c:33 list main.c: main
调试的跳步解决:
是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 *地址查看文件函数
- GDB调试
- gdb 调试
- gdb调试
- gdb 调试
- GDB调试
- GDB调试
- GDB调试
- GDB调试
- GDB调试
- GDB调试
- gdb 调试
- GDB 调试
- gdb 调试
- GDB调试
- gdb调试
- gdb调试
- GDB 调试
- GDB调试
- 数据库备份问题(另)
- SQL语句查询表结构信息(字段信息)
- 【数论】Minimum Sum LCM, UVa10791【唯一分解定理】【素数筛法】
- C的变量内存分析
- c#序列化和反序列化
- gdb调试
- 一行代码很长,复制这一行代码的技巧
- ros入门之用catkin和rosmake创建和编译功能包
- Codeforces 500B New Year Permutation [贪心]
- maven学习笔记
- JVM基础知识
- 大数据学习笔记-------------------(15)
- csdn博客ceshi123456
- Java虚拟机(五)——垃圾收集机制