zoukankan      html  css  js  c++  java
  • 《用GDB调试程序(四)》

    版权声明:本文为CSDN博主「haoel」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/haoel/article/details/2881

    1.查看栈信息

      当程序被停住了,你需要做的第一件事就是查看程序是在哪里停住的。当你的程序调用了一个函数,函数的地址,函数参数,函数内的局部变量都会被压入“栈”(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

      打印出当前的函数中的异常处理信息。

    2.查看源程序

    2.1显示源代码

      GDB 可以打印出所调试程序的源代码,当然,在程序编译时一定要加上-g的参数,把源程序信息编译到执行文件中。不然就看不到源程序了。当程序停下来以后,GDB会报告程序停在了那个文件的第几行上。你可以用list命令来打印程序的源代码。还是来看一看查看源代码的GDB命令吧。

    list <linenum>

      显示程序第linenum行的周围的源程序。

    list <function> 

      显示函数名为function的函数的源程序。

    list 

      显示当前行后面的源程序。

    list - 

      显示当前行前面的源程序。

      一般是打印当前行的上5行和下5行,如果显示函数是是上2行下8行,默认是10行,当然,你也可以定制显示的范围,使用下面命令可以设置一次显示源程序的行数。

      

  • 相关阅读:
    又玩起了“数独”
    WebService应用:音乐站图片上传
    大家都来DIY自己的Blog啦
    CSS导圆角,不过这个代码没有怎么看懂,与一般的HTML是不同
    网站PR值
    CommunityServer2.0何去何从?
    网络最经典命令行
    炎热八月,小心"落雪"
    Topology activation failed. Each partition must have at least one index component from the previous topology in the new topology, in the same host.
    SharePoint 2013服务器场设计的一些链接
  • 原文地址:https://www.cnblogs.com/zhuangquan/p/11913096.html
Copyright © 2011-2022 走看看