GDB是GNU开源组织发布的⼀个强⼤的UNIX下的程序调试⼯具。或许,各位⽐较喜欢那种图形界⾯⽅式的,像VC、BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试⼯具有⽐VC、BCB的图形化调试器更强⼤的功能。所谓“⼨有所长,尺有所短”就是这个道理。 ⼀般来说GDB主要调试的是C/C++的程序。要调试C/C++的程序,⾸先在编译时,我们必须要把调试信息加到可执⾏⽂件中。使⽤编译器(cc/gcc/g++)的 -g 参数可以做到这⼀点。如:
> cc -g hello.c -o hello
> g++ -g hello.cpp -o hello
gdb +程序名运⾏(gdb main)
使⽤ "--tui" 参数,可以在终端窗⼝上部显⽰⼀个源代码查看窗。
gdb --tui main
list(l) 查看最近10⾏源码
list file:fun 查看file⽂件中的fun函数源码
list num1 num2 查看num1~num2⾏的源码
break ⾏号
break fun 在函数处设置断点
break file:⾏号
break file:fun
远程医疗系统
break if <condition> 条件成⽴时程序停住
info break (i b)查看断点
安里屋watch expr 当expr的值发⽣改变时,程序停住
图形用户界面delete n 删除断点
探术
run/r 启动程序
continue(c) 运⾏⾄下⼀个断点
step(s) 单步跟踪,进⼊函数
next(n) 单步跟踪,不进⼊函数
金融交易系统finish 运⾏程序,直到当前函数完成返回,并打印函数返回时的堆栈地址和返回值及参数信息
until 运⾏程序直到程序退出循环体
print i (p i) 查看变量的值
ptype 查看变量类型
print array 查看数组
print *array@len 查看动态内存
print x=5 改变运⾏时的数据武经七书直解
print &array 查看数组的地址
回车代表上⼀个命令
core⽂件
在程序崩溃时,⼀般会⽣成⼀个⽂件叫core⽂件。core⽂件记录的是程序崩溃时的内存映像,并加⼊调试信息。core⽂件⽣成的过程叫做core dump
设置⽣成core⽂件
ulimit -c 查看core-dump状态
ulimit -c 数字
ulimit -c unlimited
gdb利⽤core⽂件调试
gdb ⽂件名 core⽂件
Backtrace(bt) 查看堆栈
多线程调试
info threads 显⽰当前可调试的所有线程
thread ID 切换当前调试的线程为指定ID的线程
attach process-id 在gdb状态下,开始调试⼀个正在运⾏的进程
thread apply all command 所有线程执⾏command
下⾯给⼤家⼀个好玩的多线程程序,答案就在某个线程的堆栈中,先不要看下⾯的答案,⾃⼰试着⽤gdb玩⼀下哈(Linux 64bit)。
答案在下⾯图中,先不要看。。
The answer is orangutan.