支持HW团队,就支付宝领取下面的红包吧!(2018年3月31前,就几毛,也会几块,可以和其他红包叠加使用),你领取消费,HW有奖励。红包使用无条件限制,有条件请注意是不是有病毒。

小伙伴们,给大家发红包喽!人人可领,领完就能用。祝大家领取的红包金额大大大!#吱口令#长按复制此消息,打开支付宝就能领取!er1OEj73Uj

登入 注册 | 验证
| 搜索
HelloWorld论坛 : > 计算机科学、技术、教学> 编程入门> c、c++基础> GDB 调试 总结
 
 
 
 
 
 
 
 
 
 
 
 
类别:其他 阅读:10183 评论:0 时间:十二月 18, 2012, 8:45 a.m. 关键字:GDB 调试

 

 GDB 多线程调试

info thread 查看当前进程的线程。
thread <ID> 切换调试的线程为指定ID的线程。
break file.c:100 thread all  在file.c文件第100行处为所有经过这里的线程设置断点。
set scheduler-locking off|on|step,这个是问得最多的。在使用step或者continue命令调试当前被调试线程的时候,其他线程也是同时执行的,怎么只让被调试程序执行呢?通过这个命令就可以实现这个需求。
off 不锁定任何线程,也就是所有线程都执行,这是默认值。
on 只有当前被调试程序会执行。
step 在单步的时候,除了next过一个函数的情况(熟悉情况的人可能知道,这其实是一个设置断点然后continue的行为)以外,只有当前线程会执行。

让GDB记录输出信息到文件

当使用GDB的时候,有时候需要记录GDB的输出,如果单纯使用ctrl-c ctrl-v的方法,有时候会出现问题,所以GDB有记录输出到文件的功能。

set logging on

打开记录功能。

set logging off

关闭记录功能。

set logging file file

改变记录文件,默认记录文件是gdb.txt。

set logging overwrite [on|off]

设置GDB是否以覆盖的方式写记录信息到文件中。

默认这个项目是关闭,也就是以添加的形式将记录信息写入文件,这样之前文件中的信息不会被覆盖掉。
如果打开这个项目,打开记录功能后记录文件原来的内容都将消失。

注意:如果设置这个选项的时候记录功能已经打开,需要关闭记录功能再重新打开才能起作用。

set logging redirect [on|off]

设置输出信息只记录到文件不作显示。

默认这个项目是关闭的,GDB将输出信息到终端和记录文件。如果打开这个项目,GDB将只输出信息到记录文件。

注意:和上面的项目一样,如果设置这个选项的时候记录功能已经打开,需要关闭记录功能再重新打开才能起作用。

show logging

显示记录功能中每个选项的设置。

注意:记录功能只能记录GDB的输出信息,被调试程序(inferior)的输出信息仍然会输出到终端。

 GDB堆栈跟踪的方法

程序“调用堆栈”是当前函数之前的所有已调用函数的列表(包括当前函数)。每个函数及其变量都被分配了一个“帧”,最近调用的函数在 0 号帧中(“底部”帧)。要打印堆栈,发出命令 'bt'('backtrace' [回溯] 的缩写):

(gdb) bt
#0  0x80483ea in wib (no1=8, no2=8) at eg1.c:7
#1  0x8048435 in main (argc=1, argv=0xbffff9c4) at eg1.c:21

此结果显示了在 main() 的第 21 行中调用了函数 wib()(只要使用 'list 21' 就能证实这一点),而且 wib() 在 0 号帧中,main() 在 1 号帧中。由于 wib() 在 0 号帧中,那么它就是执行程序时发生算术错误的函数。
实际上,发出 'info locals' 命令时,gdb 会打印出当前帧中的局部变量,缺省情况下,这个帧中的函数就是被中断的函数(0 号帧)。可以使用命令 'frame' 打印当前帧。要查看 main 函数(在 1 号帧中)中的变量,可以发出 'frame 1' 切换到 1 号帧,然后发出 'info locals' 命令:
(gdb) frame 1
#1  0x8048435 in main (argc=1, argv=0xbffff9c4) at eg1.c:21
21          result = wib(value, div);
(gdb) info locals
value = 8
div = 8
result = 4
i = 2
total = 6
   
此信息显示了在第三次执行 "for" 循环时(i 等于 2)发生了错误,此时 "value" 等于 "div"。
可以通过如上所示在 'frame' 命令中明确指定号码,或者使用 'up' 命令在堆栈中上移以及 'down' 命令在堆栈中下移来切换帧。要获取有关帧的进一步信息,如它的地址和程序语言,可以使用命令 'info frame'。
gdb 堆栈命令可以在程序执行期间使用,也可以在 core 文件中使用,因此对于复杂的程序,可以在程序运行时跟踪它是如何转到函数的。

 查看栈信息

当程序被停住了,你需要做的第一件事就是查看程序是在哪里停住的。当你的程序调用了一个函数,函数的地址,函数参数,函数内的局部变量都会被压入“栈”(Stack)中。你可以用GDB命令来查看当前的栈中的信息。
下面是一些查看函数调用栈信息的GDB命令:
    Backtrace,bt 打印当前的函数调用栈的所有信息。如:        
        (gdb) bt
        #0 func (n=250) at tst.c:6
        #1 0x08048524 in main (argc=1, argv=0xbffff674) at tst.c:30
        #2 0x400409ed in __libc_start_main () from /lib/libc.so.6        
从上可以看出函数的调用栈信息:__libc_start_main --> main() --> func()    
    backtrace <n>, bt <n> n是一个正整数,表示只打印栈顶上n层的栈信息。
    backtrace <-n> ,bt <-n> -n表一个负整数,表示只打印栈底下n层的栈信息。        
如果你要查看某一层的信息,你需要在切换当前的栈,一般来说,程序停止时,最顶层的栈就是当前栈,如果你要查看栈下面层的详细信息,首先要做的是切换当前栈。
frame <n>,f <n> n是一个从0开始的整数,是栈中的层编号。比如:frame 0,表示栈顶,frame 1,表示栈的第二层。
   up <n>         表示向栈的上面移动n层,可以不打n,表示向上移动一层。
down <n> 表示向栈的下面移动n层,可以不打n,表示向下移动一层。
上面的命令,都会打印出移动到的栈层的信息。如果你不想让其打出信息。你可以使用这三个命令:
     select-frame <n> 对应于 frame 命令。
      up-silently <n> 对应于 up 命令。
      down-silently <n> 对应于 down 命令。
查看当前栈层的信息,你可以用以下GDB命令:
frame 或 f       会打印出这些信息:栈的层编号,当前的函数名,函数参数值,函数所在文件及行号,函数执行到的语句。
info frame,info f 这个命令会打印出更为详细的当前栈层的信息,只不过,大多数都是运行时的内内地址。比如:函数地址,调用函数的地址,被调用函数的地址,目前的函数是由什么样的程序语言写成的、函数参数地址及值、局部变量的地址等等。如:
           (gdb) info f
           Stack level 0, frame at 0xbffff5d4:
             eip = 0x804845d in func (tst.c:6); saved eip 0x8048524
             called by frame at 0xbffff60c
             source language c.
             Arglist at 0xbffff5d4, args: n=250
             Locals at 0xbffff5d4, Previous frame's sp is 0x0
             Saved registers:
             ebp at 0xbffff5d4, eip at 0xbffff5d8              
     info args      打印出当前函数的参数名及其值。     
     info locals     打印出当前函数中所有局部变量及其值。        
     info catch      打印出当前的函数中的异常处理信息。

    

相关博文:
相关博文 首页 上页 1 2 3 4 5 下页 尾页 共5条
文件名 大小 时间 会员 费用 操作
现代体系结构上的unix系统-内核程序员的SMP和Cache技术.pdf(良好) 10M62K 二月 6, 2013, 3:44 a.m. 初学MPEG 积分:0
荣誉:0
会币:0
下载
走下神坛的内存调试器--定位多线程内存越界问题实践总结.pdf(良好) 844K746B 二月 6, 2013, 3:44 a.m. 初学MPEG 积分:0
荣誉:0
会币:0
下载
 
 
[挂载人]初学MPEG [审核人]初学MPEG

个人签名--------------------------------------------------------------------------------

Please Login (or Sign Up) to leave a comment