大神的gdb&debug使用心得你学不学
一、符号表
说明 gdb调试的前提是要有符号表。如果程序是release版本,符号表不全,则使用gdb调试时,不能单步调试,成员变量等信息不可查
如何生成符号表
编译代码时加上-g参数,则编译的程序中会带有当前程序的符号表。
如 gcc -o main main.c,则可对main程序进行单步调试
二、调试
假设有一进程test
gdb test //调试某一可执行程序
run(简写为r) //运行进程,假设有入参,则运行run argv
三、断点相关
1.设置断点
设置断点的命令为b
1 | 1)b function 将函数function设置为断点 |
2,查看当前断点信息 info b
3,删除当前断点信息 delete 1 delete加断点的number,或者用d 1
4,使当前断点失效 disable 1 如果断点已失效 用enable 1时断点1继续生效
5,清除所有断点 clear
四、打印变量的值
1,print i 简写为p打印变量i的值
2,p/x i 以十六进制打印变量i的值 八进制(o),二进制(t)
五、调试基本命令
1,bt 查看当前栈空间信息
2,next 简写为n 进行单步调试
3,step 简写为s 遇到函数时进入函数
4,finish 结束当前函数
5,continue 简写为c,遇到断点继续执行用c ;c 3,忽略断点,直到第三次碰到断点
6,untill 简写为u,循环体直接退出
7,set i = 1 当前断点处设置变量i的值为1
8,info locals 显示当前所有局部变量
六、稍微高级点的用法
1,command
在断点处做处理,如下图,当i=5时,attach.c的第16行停住,执行的命令时打印i的值
command后面加数字代表的是对某个断点做command
2, frame 2 跳到2号栈框
3,@ 数组打印用@,假设需要打印10个字符,变量为tt,则p@10
4,call 执行某个函数时用
6,set follow-fork-mode child/parent 当fork子进程需要跟子进程时用,或跟进父进程使用
7,gdb attach xx 跟进正在运行pid为xxx的程序
8,jump gdb可以改变程序的运行顺序
jump test.c:10 直接跳转到test.c的第10行运行,跳过中间代码
jump +10 直接跳转到当前断点后的第10行,跳过中间代码
9,return 强制返回,剩余代码不再还行
10, up 上移栈针,使上一个函数成为当前函数
七、多线程调试
- info thread 查看所有线程信息
- thread x 将程序跳到线程x的栈框
- break thread_test.c:123 thread all 在所有线程中相应的行上设置断点
- set scheduler-locking off|on 锁定当前线程,只调试当前线程
八、其他
- list function 显示某个函数的源码
- list 显示当前行后面的源程序
- list - 显示当前行前面的源程序
- show listsize 查看当前listsize的设置。
- set listsize count 设置一次显示源代码的行数
九、实战应用
- strace -f -tt -p [pid] -f 跟踪所有子进程和线程 -tt可以显示时间
- top -Hp [pid] 可以查看一个进程所有线程的cpu使用情况
- pstack [pid] 可以查看进程所有线程的调用栈
- gdb, attach [pid]、info threads、thread [thread num]查看调用栈
- strace -f -tt -c -p [pid] 加上-c 可以查看一定时间内系统调用的统计
- ltrace -p [pid] 查看进程调用库函数的
————————————————
版权声明:本文为CSDN博主「qq_23953675」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_23953675/article/details/106116247
原文链接:https://blog.csdn.net/qq_23953675/article/details/105291724
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 --小 · 崧 · 子--!