4 在GDB里运行程序

4.1 为调试而编译

-g 

-g -o          编译器优化,有些没用过的变量可能被优化掉

run | r

4.3 程序参数

gdb --args test 111

show args      显示在启动时传入的参数

set args       为你的下一次执行程序设置参数

set args 111

4.4 程序环境

show paths               显示当前PATH

path directory           新增路径到PATH

show environment PATH 

set environment PATH=xxx

unset environment PATH 

4.5 程序的工作目录

cd directory

pwd

4.7 调试一个已经在运行的进程

shell ps -ef | grep xxx

attach process-id

detach

4.8 杀死子进程

kill

4.9 调试多线程进程

多线程共享一个地址空间,即他们可以检查和修改同一个变量;

每个线程有它自己的寄存器和执行栈,也可能有自己的存储空间.

thread threadno                     切换线程

info threads                        查询线程

thread apply [threadno] [all] args  在一个或多个线程上执行命令,如线程特定断点

thread apply all args

thread apply xxx xxx args

set print thread-events             控制线程开始和结束时打印消息

set print thread-events on

set print thread-events off

4.10 调试多个程序

程序创建子进程时,GDB会继续调试子进程,而子进程不受影响.

(1)方法1

在fork调用后的子进程代码里调用sleep,ps得到pid,再gdb attach到子进程

(2)方法2

Linux系统上,GDB提供调试用fork或vfork调用创建子进程的程序的支持。

set follow-fork-mode

set follow-fork-mode mode 

mode:

parent     fork之后调试原进程

child     fork之后调试新进程

show follow-fork-mode

设置GDB在fork之后是否detach进程中的一个,或继续保留控制控制这两个进程。

set detach-on-fork

set detach-on-fork mode

mode:

on     子进程或父进程(依赖于follow-fork-mode)会被detach然后独立运行

off    两个进程都由GDB控制。子进程或父进程(依赖于follow-fork-mode)被调试,另外一个则被挂起。

show detach-on-fork

可以用info forks来查看GDB里创建的子进程,用fork来从一个进程切换到另一个进程。

info forks

fork fork-id

process process-id      切换到process-id指定的进程

detach fork fork-id     结束调试进程,进程被允许继续独立运行

delete fork fork-id     杀死调试进程

4.11 为跳转设置书签

Linux上,GDB可以保存一个程序状态的快照,称为检查点,以后可以跳回。这样可以不需要重新启动程序复现!!!

checkpoint     保存被调试程序当前执行状态的快照

info checkpoints

restart checkpoint-id 

delete checkpoint checkpoint-id

猜你喜欢

转载自blog.csdn.net/u012906122/article/details/113926667