1.
脚本的写法:参考
脚本调试:
# 方法一: 在gdb的interactive界面运行 source mycmd.gdb (gdb) file test.exe (gdb) source mycmd.gdb # 方法二: 在命令行中运行 gdb 的 batch 模式命令 gdb --batch --command=cmd.gdb --args test.exe <add necessary parameters here> # 方法三: sudo gdb -p "$(pidof my-app)" -batch \ -ex "set logging on" \ -ex continue \ -ex "bt full" \ -ex quit # 方法四: #!/bin/sh gdb app <<GDB_INPUT pwd run X a b c quit GDB_INPUT # 原文链接:https://blog.csdn.net/nirendao/article/details/105910753 # https://qastack.cn/programming/10748501/what-are-the-best-ways-to-automate-a-gdb-debugging-session
# http://62.234.115.194/ask/100322110.html
ctrl + x + a 切换gdb的TUI
编译的时候如果用了-o2/o3,看调用栈的时候就会有一些问题。
ulimit -c unlimited,生成core文件;然后主机使用xxx-linux-gdb ./test ./core。
gdb三种调试方式:gdb ./exec gdb attach pid gdb ./exec ./corefile
atach的方式用于调试正在运行中的程序。attach 会打断进程运行。
detach 输入以后即可解除 attach 让程序继续运行。
运行程序的时候如果发生了core dump才会产生core dump文件。只有特定的信号集才能产生core dump。
/etc/profile里面加 ulimit -c unlimit 就可以解除core dump文件大小的限制。
配置core dump文件生成目录:
vim /etc/sysctl.conf kernel.core_pattern=$HOME/core_dump/core-%e-%p-%t 对应自己要存放的目录 %e是当前目录名+PID+时间
退出:ctrl + b 或者 q
set 命令设置参数,如果有空格,要用双引号包住。
show args 显示所有参数。
run [arg] 简记为 r
bt 显示栈帧,输入 f 7,切到对应的 #7 的地方,l 列出这个地方的代码段。bt + f 可以一层一层的去看调用栈。
b filename:line 打断点。
b ClassName::funcname 不加参数,打断点。
c 继续。
n 单步执行。
s, step命令可以进入到函数里面。
info命令:参考 常用:info b显示打了哪些断点。
list:查看代码,简记 l, l 然后 b line 就可以一行一行的调试。然后 c、bt 等查看更多信息,一行一行的调试。l -20
strip ./exec 去掉因为加-g参数产生的调试符号,可以看见文件变小了。
直接输入delete可以删除所有的断点。
finish 命令执行当前函数直到正常退出该函数。
return 直接结束当前正在运行的函数。一般都用finish正常结束函数,退到上一层进来的地方。
p xxx 即print, 打印变量,结构体指针要加*号解引用去看。
u line 即 until,运行到某行再停下来。
jump:做测试比较多。jump 8,jump12。如果跳不过去就是没条件执行。
tbreak main,设置临时断点,即gdb退出以后再进来,断点就不在了。
watch,看变量变化,变量变了之后就会停下来。
display,也是看变量的。每一次都会打出变量。配合delete display xxx、info display xxx。
多线程:
info threads:显示所有线程信息。显示很多线程时,main函数所在就是主线程。
线程切换:thread 2
调试时锁住线程:set scheduler-locking on。 一般都是切到某个线程并锁住。c 继续。set scheduler-locking off 关闭锁。作用就是调试的时候不在各个线程里面乱窜。关于lock,在gdb里面有更详细的讲解。
info args 可以显示该函数的所有参数。
多进程:
set fllow-fork mode,设置当一个进程fork出子进程的时候调试哪个,防止乱窜。如,把命令的 mode 改成 child。
学nginx的时候就可以学attach怎么处理。
常用命令:
list显示出的大小还可以修改。set listsize 20
list 10,100 显示该范围内的。
chrome使用gdb调试