GDB查看栈信息

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

下面是一些查看函数调用栈信息的GDB命令:

backtrace
bt

打印当前的函数调用栈的所有信息。如:
&">nbsp;
(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

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

时间: 2024-09-18 22:15:37

GDB查看栈信息的相关文章

在C/C++程序里打印调用栈信息

我们知道,GDB的backtrace命令可以查看堆栈信息.但很多时候,GDB根本用不上.比如说,在线上环境中可能没有GDB,即使有,也不太可能让我们直接在上面调试.如果能让程序自己输出调用栈,那是最好不过了.本文介绍和调用椎栈相关的几个函数.   NAME       backtrace, backtrace_symbols, backtrace_symbols_fd - support for application self-debugging SYNOPSIS       #include

gdb-gdp调试的时候查看寄存器信息提示 The program has no registers now.怎么解决?

问题描述 gdp调试的时候查看寄存器信息提示 The program has no registers now.怎么解决? 源代码是这样的#include ""stdio.h""#include ""string.h"" char code[]=x41x41x41x41x41""x41x41x41x41x41""x41x41x41x41x41""x41x41x41&q

[20150520]使用gdb查看等待事件.txt

[20150520]使用gdb查看等待事件.txt -- 昨天开始重看vage-- 使用gdb 看等待事件这部分内容跳过了,今天测试看看.如何操作. -- 实际上设置断点在gdb下,11g等待事件的起始函数是kslwtbctx函数.还是通过演示来说明: 1.测试环境: SCOTT@test> @ver1 PORT_STRING                    VERSION        BANNER ------------------------------ -------------

ubuntu系统中查看硬件信息命令指南

&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp;    查看ubuntu硬件信息 1, 主板信息 .查看主板的序列号 -------------------------------------------------- #使用命令 dmidecode | grep -i 'serial number' #查看板卡信息 cat /proc/pci -----------------------------------

Linux下查看硬件信息的方法

  用硬件检测程序kuduz探测新硬件:service kudzu start ( or restart) 查看CPU信息:cat /proc/cpuinfo 查看板卡信息:cat /proc/pci 查看PCI信息:lspci (相比cat /proc/pci更直观) 查看内存信息:cat /proc/meminfo 查看USB设备:cat /proc/bus/usb/devices 查看键盘和鼠标:cat /proc/bus/input/devices 查看系统硬盘信息和使用情况:fdisk

Linux Shell脚本查看NUMA信息

  这篇文章主要介绍了Linux Shell脚本查看NUMA信息,本文直接给出脚本实现代码,需要的朋友可以参考下 Nova在NFV场景下会提供NUMA相关高级特性,这里提供一个脚本查看计算节点的NUMA相关信息. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50

linux中如何查看cpu信息、机器硬件型号

  # cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c 8 Intel(R) Xeon(R) CPU E5410 @ 2.33GHz (看到有8个逻辑CPU, 也知道了CPU型号) # cat /proc/cpuinfo | grep physical | uniq -c 4 physical id : 0 4 physical id : 1 (说明实际上是两颗4核的CPU) # getconf LONG_BIT 32 (说明当前CPU

Windows下查看电脑信息的命令

Windows下查看电脑信息的命令 查看当前ip: cmd----->ipconfig/all 查看电脑配置 ---->dxdiag 查看注册表信息 ---->regedit 查看系统属性 ---->sysdm.cpl 查看系统信息 ---->msinfo32 查看网络 nbtstat -aAn a 远程主机的名称,便可知NETBIOS A 远程主机的ip 便可知NETBIOS n 列出本地主机的NETBIOS 查看网络状态 netstat -ar a 查看本地机器的所有的端

Beyond Compare怎么查看文件信息

  Beyond Compare怎么查看文件信息         具体操作步骤如下所示 步骤一:打开Beyond Compare软件,选择图片比较会话,打开会话操作界面.分别单击界面两侧"打开文件"按钮,选择需要比较的图片文件. 步骤二:单击图片比较会话菜单栏"视图"按钮,在展开的菜单中选择"文件信息"操作命令,其中视图菜单内容还包括:容差模式.不匹配范围模式,混合模式,您可以根据图片比较的标准,选择最适合的图片比较方式. Beyond Comp