GDB查看堆栈变量

gdb 调试段错误 gdb --args <可执行文件> <参数>:启动 GDB 并将参数传递给可执行文件。注:很多时候也返回不了堆栈信息,就需要加打印手动缩小范围,重点关注指针,数组等地址操作。return <表达式>:在当前函数中返回指定的表达式结果。gdb <可执行文件>:启动 GDB 并加载可执行文件。注意:源代码编译的时候要加-g选项生成调试信息。set <变量名> = <值>:修改变量的值。 阅读详情

查看栈信息
—————

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

一、显示源代码

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

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

    set listsize <count>
        设置一次显示源代码的行数。
        
    show listsize
        查看当前listsize的设置。
       

list命令还有下面的用法:

    list <first>, <last>
        显示从first行到last行之间的源代码。
    
    list , <last>
        显示从当前行到last行之间的源代码。
        
    list +
        往后显示源代码。
       

一般来说在list后面可以跟以下这们的参数:

    <linenum>   行号。
    <+offset>   当前行号的正偏移量。
    <-offset>   当前行号的负偏移量。
    <filename:linenum>  哪个文件的哪一行。
    <function>  函数名。
    <filename:function> 哪个文件中的哪个函数。
    <*address>  程序运行时的语句在内存中的地址。
   

二、搜索源代码

不仅如此,GDB还提供了源代码搜索的命令:

    forward-search <regexp> 
    search <regexp>
        向前面搜索。

    reverse-search <regexp> 
        全部搜索。
        
其中,<regexp>就是正则表达式,也主一个字符串的匹配模式,关于正则表达式,我就不在这里讲了,还请各位查看相关资料。


三、指定源文件的路径

某些时候,用-g编译过后的执行程序中只是包括了源文件的名字,没有路径名。GDB提供了可以让你指定源文件的路径的命令,以便GDB进行搜索。

    directory <dirname ... >
    dir <dirname ... >
        加一个源文件路径到当前路径的前面。如果你要指定多个路径,UNIX下你可以使用“:”,Windows下你可以使用“;”。
    directory 
        清除所有的自定义的源文件搜索路径信息。
    
    show directories 
        显示定义了的源文件搜索路径。
       

四、源代码的内存

你可以使用info line命令来查看源代码在内存中的地址。info line后面可以跟“行号”,“函数名”,“文件名:行号”,“文件名:函数名”,这个命令会打印出所指定的源码在运行时的内存地址,如:

        (gdb) info line tst.c:func
        Line 5 of "tst.c" starts at address 0x8048456 <func+6> and ends at 0x804845d <func+13>.

还有一个命令(disassemble)你可以查看源程序的当前执行时的机器码,这个命令会把目前内存中的指令dump出来。如下面的示例表示查看函数func的汇编代码。

        (gdb) disassemble func
        Dump of assembler code for function func:
        0x8048450 <func>:       push   %ebp
        0x8048451 <func+1>:     mov    %esp,%ebp
        0x8048453 <func+3>:     sub    $0x18,%esp
        0x8048456 <func+6>:     movl   $0x0,0xfffffffc(%ebp)
        0x804845d <func+13>:    movl   $0x1,0xfffffff8(%ebp)
        0x8048464 <func+20>:    mov    0xfffffff8(%ebp),%eax
        0x8048467 <func+23>:    cmp    0x8(%ebp),%eax
        0x804846a <func+26>:    jle    0x8048470 <func+32>
        0x804846c <func+28>:    jmp    0x8048480 <func+48>
        0x804846e <func+30>:    mov    %esi,%esi
        0x8048470 <func+32>:    mov    0xfffffff8(%ebp),%eax
        0x8048473 <func+35>:    add    %eax,0xfffffffc(%ebp)
        0x8048476 <func+38>:    incl   0xfffffff8(%ebp)
        0x8048479 <func+41>:    jmp    0x8048464 <func+20>
        0x804847b <func+43>:    nop
        0x804847c <func+44>:    lea    0x0(%esi,1),%esi
        0x8048480 <func+48>:    mov    0xfffffffc(%ebp),%edx
        0x8048483 <func+51>:    mov    %edx,%eax
        0x8048485 <func+53>:    jmp    0x8048487 <func+55>
        0x8048487 <func+55>:    mov    %ebp,%esp
        0x8048489 <func+57>:    pop    %ebp
        0x804848a <func+58>:    ret
        End of assembler dump.

PaddleOCR多进程GPU推理实战:200万图片高效处理方案 本文详细介绍了PaddleOCR多进程GPU推理在高效处理200万张图片OCR任务中的实战方案。通过优化GPU利用率、多进程并发和关键参数调优,实现了从单进程3000张/小时到8进程3万张/小时的性能飞跃,为大规模OCR处理提供了可靠解决方案。 阅读详情

相关推荐

储能系统架构和控制

探讨了储能系统中EMS(能源管理系统)、BMS(电池管理系统)和PCS(功率转换系统)之间的协同机制,以及组串式和集中式储能系统的技术架构、优势和局限性。EMS根据电价、电网需求和电池状态制定充放电策略,BMS提供电池数据,PCS执行充放电控制。组串式系统具有独立管理和灵活扩展的优势,但成本较高;集中式系统成本效益高,但存在环流和木桶效应问题。

蓝龙宝藏的博客 3864

GDB调试程序(四)

查看栈信息—————当程序被停住了,你需要做的第一件事就是查看程序是在哪里停住的。当你的程序调用了一个函数,函数的地址,函数参数,函数内的局部变量都会被压入“栈”(Stack)中。你可以用GDB命令来查看当前的栈中的信息。下面是一些查看函数调用栈信息的GDB命令:    backtrace     bt         打印当前的函数调用栈的所有信息。如:               

陈皓专栏 【空谷幽兰,心如皓月】 5万+

ASP,NET源码——[新闻文章]NewsDig(新闻自动采集系统)源代码.zip

ASP,NET源码——[新闻文章]NewsDig(新闻自动采集系统)源代码.zip

gdb调试小结

一、启动 1、gdb 2、调试在线进程 (1)启动gdb时链接目标进程 (2)gdb中链接目标进程: (3)断开链接: 二、信息显示 1、栈信息 2、变量 3、寄存器 4、内存 5、源代码 6、显示格式 三、断点 1、设置断点 2、 查看、删除断点 3、设置无效、有效断点: 4、条件断点 5、监视点 6、断点命令 四、其他 1、强制函数返回 2、强制调用函数 参考 ...

milletluo的博客 1万+

gdb 如何查看堆栈信息和寄存器信息?

gdb 如何查看堆栈信息和寄存器信息?

深耕嵌入式领用多年, 致力于分享嵌入式领域技术! 3879

转载: gdb查看运行时数据

在你调试程序时,当程序被停住时,你可以使用print命令(简写命令为p),或是同义命令inspect来查看当前程序的运行数据。print命令的格式是:printprint /是表达式,是你所调试的程序的语言的表达式(GDB可以调试多种编程语言),是输出的格式,比如,如果要把表达式按16进制的格式输出,那么就是/x。一、表达式print和许多GDB的命令一样,可以接受一个表达式,GDB会根据当前的程...

weixin_34256074的博客 888

GDB调试从入门到进阶

通过调试程序,我们可以监控程序执行的每一个细节,包括变量的值、函数的调用过程、内存中数据、线程的调度等,从而发现隐藏的错误或者低效的代码;在我们日常coding debug时,有时很难肉眼发现自己写的代码的问题之处,这时GDB就排上用场了。

保持一颗永远好奇、勇于探索的心 6616

在Linux下使用vscode使用交叉编译工具链的gdb对core文件进行堆栈变量查看

我们拿到此文件后,可以在交叉编译的主机上,利用其工具链的gdb+编译时产生的符号信息来查看gdb的内容,方便我们定位代码出错的地方。但是仅仅用gdb的话,只能靠命令行窗口查看,不是很方便,但是可以配合vscode。注意下面这段代码是需要自己手动插入的,vscode自带的模板中是没有的。在vscode的debug栏,点击Run and debug里面的。当我们交叉编译的程序在目标机器崩溃挂掉的时候,一般可以通过设置。然后,执行,就可以看到调用堆栈局部变量、源码等信息了。让其生成一个core文件。

joyopirate的博客 799

GDB查看堆栈局部变量

GDB查看堆栈局部变量 “参数从右到左入栈”,“局部变量在栈上分配空间”,听的耳朵都起茧子了。最近做项目涉及C和汇编互相调用,写代码的时候才发现没真正弄明白。自己写了个最简单的函数,用gdb跟踪了调用过程,才多少懂了一点。 参考资料: http://blog.csdn.net/liigo/archive/2006/12/23/1456938.aspx http://blog.cs...

dielucui7698的博客 3087

使用gdb查看调式程序,IDE集成编程环境是如何使用gdb展示堆栈和监视变量

最直观的当属于vscode配置c/c++的debug环境了,在vscode中有个.vscode文件夹,里面有一个lanuch.json文件,里面就可以配置gdb,gcc的文件位置,还有传入的命令参数,让vscode能够直接像visual studio那样直接把程序跑起来,并且配备了直观,好用的互动debug界面包含但不限于调用堆栈的显示,局部变量自动监视,全局变量监视等功能。但是我很好奇这个gdb是如何规整地查看这些变量的数据的,这个工具是怎么样调用底层的gdb来完成这一个过程的,于是就自己琢磨了一下。

m0_59576377的博客 638

linux—常用gdb调试命令汇总

如果是函数递归调用,当还没开始递归时,finish会执行完整个函数,自动走完全部递归过程(前提无断点)。因为在linux系统下,默认生成的可执行程序是release版,但是调试需要debug版本。*gdp会自动记录最近的命令,如果没有输入其他命令,可以按enter键继续执行最近命令。需要注意的是,不能直接写变量名,变量编号使用infodisplay即可知道。如果我们需要在调试中一直显示某个变量的值,那么就需要display命令了。需要注意的是,这种方法只能显示一次变量值,当继续调试时变量不再显示。...

weixin_61857742的博客 2万+

linux下的工具---gdb

linux下的工具gdb

m0_69323023的博客 1067

gdb 调试

传参 如果程序执行的时候需要加入参数,如 ./sample aa bb 使用 gdb 的时候可以使用如下方式 gdb --args ./sample aa bb 执行 启动 gdb 之后,直接使用 r,就是 run 的意思,或者可以使用 b 加一个断点进行调试。 处理信号 如果在使用的时候,遇到类似下面的报错 Thread 2 “sample_sd_abnor” received s...

NeilZhy 615

【工具】 GDB的使用

backtrace(或bt)查看调用堆栈frame(或f)查看特定帧info frame和info stack查看详细的堆栈信息和info args查看局部变量和参数x命令查看内存内容up和down在堆栈帧中移动list查看源代码行这些工具可以帮助你更好地理解程序的运行状态和调试复杂问题。ps:栈和栈帧的区别栈是数据结构,先进后出栈帧可以当作一块函数调用的内存,保存着函数执行状态/参数/局部变量/返回地址等。

weixin_63555845的博客 743

linux下的gdb调试

在vs下程序有debug版本和release版本,debug版本方便程序员调试,release版本也就是发布版本,是供用户调试使用的。gcc/g++的可执行程序默认是release版本。上图代码是个简单的小程序,通过这个代码我们来测试一下gcc下编译后的可执行程序是否是release版本。通过使用makefile来进行编译debug版本则需要加“-g”也就是debug的最后一个字母。myexe的文件大小明显比myexe-debug文件大小要小readelf,elf大致意思是查看文件的格式.

. 1165

gdb调试工具使用

gdb是gcc的调试工具,主要用于C和C++语言编写的程序。通过gdb调试工具,我们可以设置断点、查看变量、动态改变程序的运行环境等,可以很好的帮助我们查找程序的bug。 1. 编译 想要使用gdb工具,编译时必须使用**-g**,如果没有**-g**,将看不到程序的变量名、函数名信息,只能看到运行时的内存地址。编译方式如下: gcc -g test.c -o test g++ -g test.cpp -o test 2. gdb常用命令 命令 解释 gdb program gdb pro

readyone的博客 374

GDB程序调试工具参考知识_ype &quot;apropos word&quot; to search for commands related

示例一:在进入函数func时,设置一个断点:可以敲入break func,或是直接就是b func。你可以查看到C++中的所有的重载函数及参数(注:M-?和“按两次TAB键”是一个意思)GDB会把所有make开头的函数全部例出来给你查看。(gdb) b make_

2501_90245229的博客 1536

gdb调测使用整理

gdb调测使用 整理分为:源码对应查看,断点操作,运行调试,堆栈查看,内存查看变量观察,layout设置 这几块。

春夜喜雨的专栏 1204

gdb调试常用指令

一、首先使用gdb调试之前我们生成应用程序需要带有debug信息那么我们在生成可执行程序的时候首先应该带有 -g参数 g++ -g server.cpp -o server 二、进入gdb模式 gdb 三、常用命令 1、gdb加载可执行文件 (gdb) file server Reading symbols from /usr/cyCPP/myServer/server...do

程序猿的梦想---牛逼的程序猿 2319

gdb的简易操作

gdb的简单使用

weixin_57822074的博客 168

使用GDB调试程序方法

写程序难免会遇到 Bug,这时我们就需要 GDB 来对程序进行调试了。调试需要在编译的时候,加上一些调试相关的信息,也就是说,需要指定 -g 选项。如:其中-g选项表示生成调试信息。当你在编译程序时加上-g选项,gcc会在生成的包含额外的调试信息。这些调试信息主要是关于源代码和目标代码之间的映射关系等内容。例如,它会记录变量的名称、类型、位置,函数的入口点等信息。这些调试信息对于使用调试工具(如gdb)来调试程序非常重要。调试工具可以利用这些信息来帮助你查看变量的值、设置断点、单步执行等操作。

basketball616的博客 1053
上一篇: valgrind 详细说明
simbi
博客等级 码龄22年 86粉丝 24原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值