GDB查看栈信息

linux下c语言多线程程序使用gdb查看每个线程占用的栈空间,从而可以计算出线程的栈使用率 linux下c语言多线程程序使用gdb查看每个线程占用的栈空间,从而可以计算出栈使用率 阅读详情

栈:是程序存放数据内存区域之一,特点是LIFO(后进先出)。

PUSH:入栈

POP:出战

使用场景:

1.保存动态分配的自动变量使用栈

2.函数调用时,用栈传递函数参数,半寸返回地址,返回值

代码sum.c

#include <stdio.h>      
#include <ctype.h>      
#include <stdlib.h>      
#define MAX  (1UL << 20)      
typedef unsigned long long u64;      
typedef unsigned int u32;      
u32 max_addend=MAX;      
u64 sum_till_MAX(u32 n)      
{          
	u64 sum;          
	n++;          
	sum=n;          
	if(n<max_addend)              
	sum+=sum_till_MAX(n);          
	return sum;      
}      
int main(int argc,char** argv){          
	u64 sum=0;          
	if((argc==2) && isdigit(*(argv[1])))              
	max_addend=strtoul(argv[1],NULL,0);          
	if(max_addend>MAX||max_addend==0){              
	fprintf(stderr,"Invalid number is specified\n");              
	return 1;          
	}          
	sum=sum_till_MAX(0);          
	printf("sum(0..%lu)=%llu\n",max_addend,sum);          
	return 0;      
}


 

该程序计算0到命令行参数传递过来的数字之间所有的正数和。

图a是函数调用前的栈,图b是函数调用后的栈,图c是再次函数调用后的栈。

栈上保存了函数参数,调用返回地址,上层栈帧指针和函数内部使用的自动变量。

有时,还会用栈保存寄存器,每个函数独有,称作栈帧。

此时,需要设置表示栈帧起始地址的帧指针(FP)。

栈指针(SP)永远指向栈顶!

编译程序

#gcc -g -Wall -o sum sum.c

启动gdb调试sum

#gdb sum

(gdb) disas main

从图中可见call指令自动把返回地址0x8048494压入栈中

再看sum_till_MAX函数

在栈上保存上层帧的帧指针0x8048494,

然后将新的栈帧赋给帧指针%esp,

然后在栈上分配用于保存自动变量的空间,至此完成栈帧。

0x8(%ebp)指向帧指针+8字节的地址,

-0x10(%ebp)为指针-10字节的地址

leave指令删除栈帧,释放当前的栈,

ret指令为函数返回,将栈中保存的返回地址POP到程序计数寄存器,控制权返回给调用者。

这是第二次进入sum_till_MAX函数时使用backtrace

获取当前执行位置,可以通过程序计数器PC获得,在x86上是eip寄存器,FP是ebp寄存器

下面查看栈的内容,从表示栈顶的SP开始。

(gdb) x/40xw $sp

从栈上的返回地址信息可以看到和之前backtrace结果相同的调用跟踪信息0x080484c1和0x0804858d

用frame命令查看现在选择的帧,

frame 1选择帧1

up选择下一层的帧

用info命令的frame选项可以查看更详细的栈帧信息

栈的大小限制

注意,如果上述sum程序不带参数会引发段错误。

#./sum

发生栈溢出。

下面用gdb跟踪,查看程序计数器PC即可看到程序执行位置

#gdb sum

(gdb) r

(gdb) x/i $pc

这正是将sum_till_MAX的参数PUSH到栈顶的命令

查看栈指针SP的位置

(gdb) p $sp

查看该进程的内存映射

(gdb) i proc mapping

最后一行的[stack]表示栈空间,顶端是0xbf401000,之前看到的栈指针是0xbf3ffff0,超出了栈的范围发生溢出。

分析内核转储的时候无法使用上述命令,可以使用

(gdb) info files或者(gdb) info target得到相同信息

 

linux栈大小

显示本机系统支持的栈大小

# ulimit -s
10240

修改栈大小扩大10倍

#ulimit -Ss 102400

这样就不会栈溢出了

 

Linux下默认的栈空间大小是10M,可以通过ulimit -s进行查看,不同的Linux发行版本可能不太一样。下面介绍栈空间大小修改方法。
 
临时修改方法:
ulimit -s <新的栈空间大小>
 
永久修改方法:
1. 可以修改配置文件/etc/security/limits.conf
2. 可以将ulimit -s命令放到/etc/profile中,在任何用户启动的时候调用

参考《Debug.Hacks中文版 深入调试的技术和工具-调试时必须的栈知识》

gdb 调试 1.使用gdb时,如果想查看gdb版本信息,可以使用“show version”命令; 2.gdb在启动时会显示如上类似的提示信息。如果不想显示这个信息,则可以使用-q选项把提示信息关掉: 3.使用gdb调试时,使用“info functions”命令可以列出可执行文件的所有函数名称。 4.使用gdb调试遇到函数时,使用step命令(缩写为s)可以进入函数(函数必须有调试信息)。可以使用ne... 阅读详情

相关推荐

GDB基础知识之线程停止和查看栈信息04

比如:函数地址,调用函数的地址,被调用函数的地址,目前的函数是由什么样的程序语言写成的、函数参数地址及值、局部变量的地址等等。如果你要查看某一层的信息,你需要在切换当前的栈,一般来说,程序停止时,最顶层的栈就是当前栈,如果你要查看栈下面层的详细信息,首先要做的是切换当前栈。如果你要查看某一层的信息,你需要在切换当前的栈,一般来说,程序停止时,最顶层的栈就是当前栈,如果你要查看栈下面层的详细信息,首先要做的是切换当前栈。如果你程序是多线程的话,你可以定义你的断点是否在所有的线程上,或是在某个特定的线程。

weixin_42202674的博客 1308

gdb调试查看栈内存

今天我们利用一个两层函数调用的简单程序——输入两个整数求最大公约数。来学习与理解gdb调试的过程。 首先进行代码编写 main函数: #include<stdio.h> #include"cal.h" #include"res.h" int main() { int a,b; printf("请输入两个数字:\n"); scanf("%d%d", &a, &b); int res; res = cal(a,b); printf("最

weixin_43916065的博客 5150

stack-inspector:使用gdb命令检查堆栈上对象的大小

堆栈检查器 一个gdb命令,用于检查堆栈上对象的大小。 如何 使用gdb导航到特定的堆栈框架(运行直到堆栈溢出或在某处设置断点)。 然后,只需运行: source stack -inspector.py stack -inspector

GDB使用技巧(3)——查看栈信息

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

Biao 8319

面试篇 - LoRA(Low-Rank Adaptation) 原理

输出示例:trainable params: 262,144 || all params: 6,742,016,000 || trainable%: 0.0039。论文实验显示:零初始化 BB 可使初始损失与预训练模型相差不足0.1%,而非零初始化可能差50%+。若初始 ΔW≠0,模型可能立即偏离预训练学到的知识(如GPT-3突然忘记如何造句)。:如同汽车改装,先保持原厂配置(W),再逐步加装新部件(ΔW),避免直接飙车失控。:大模型的权重变化矩阵 ΔWΔW 通常是低秩的(少数主成分主导变化)。

qq_60245590的博客 1152

Plant Simulation新手入门:从零开始搭建工厂布局仿真模型(附完整代码)

本文为Plant Simulation新手提供了一个从零开始搭建工厂布局仿真模型的完整实战教程。通过一个玩具工厂车间布局优化的具体案例,详细讲解了从数据准备、模型构建、核心逻辑编程到连接遗传算法进行自动优化的全流程,并附有完整代码示例,帮助读者快速掌握这一工业仿真软件的核心应用。

metal的博客 554

GDB frame和backtrace命令:查看栈信息

linux gdb调试

qq_39717701的博客 1726

从OSGB到3DTiles:倾斜摄影数据高效转换实战指南

本文提供了将倾斜摄影OSGB数据高效转换为Web友好的3DTiles格式的完整实战指南。详细介绍了使用开源工具进行转换的步骤,包括环境搭建、核心命令、参数调优及在Cesium中加载与问题排查,旨在帮助GIS开发者和三维应用工程师打通数据到Web展示的最后一公里,实现大规模三维模型的流畅网络发布。

u0v1w2x3的博客 570

GDB调试中查看栈信息

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

heiworld的专栏 2276

从稀疏表示到低秩表示(一)

确定研究方向后一直在狂补理论,最近看了一些文章,有了些想法,顺便也总结了representation系列的文章,由于我刚接触,可能会有些不足,愿大家共同指正。 从稀疏表示到低秩表示系列文章包括如下内容: 一、 sparse representation 二、 一、 sparse representation 1  sparsity  一个线性表示解决的问题如下图所示:

彼岸花 3万+

2025电赛嵌入式:K210教程-如何刷固件 如何烧录代码 全网唯一

本文介绍了K210开发板的固件刷写和开发环境搭建方法。主要内容包括:1)从Sipeed官网下载合适的MaixPy固件,根据需求选择完整版或精简版;2)使用k-flash等工具烧录固件,注意区分亚博和Sipeed开发板的固件版本;3)介绍了擦除闪存的两种模式(部分擦除和完全擦除)及其应用场景;4)搭建CanMV开发环境,通过MaixPy IDE连接开发板并进行程序调试。文章还提供了常见问题的解决方法,如串口驱动安装、固件兼容性检查等,为K210开发提供了完整的入门指南。

FJN110的博客 547

gdb coredump 查看栈信息

https://blog.youkuaiyun.com/suxinpingtao51/article/details/12072559

Faded0104的博客 595

SAP NetWeaver Business Client (NWBC) 的深入解析

SAP NetWeaver Business Client(NWBC)作为 SAP 提供的一种用户界面,旨在为终端用户提供无缝集成传统 SAP GUI 事务和新开发的基于 Web Dynpro ABAP 的应用程序的体验。SAP NetWeaver Business Client(NWBC)是 SAP 推出的用户界面,旨在为终端用户提供单一入口,集成传统的 SAP GUI 事务和新开发的基于 Web Dynpro ABAP 的应用程序。在实际业务场景中,NWBC 的应用提升了用户的工作效率和体验。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1607

用GDB调试程序(8)──查看栈信息

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

904

通用具身智能仿真平台桃源2.0,三行代码定义任务,数采效率最高提升20倍

木木-具身Xbot具身知识库2025年03月13日 17:40浙江在首个“城市级”大规模仿真平台GRUtopia1.0的基础上,升级后的GRUtopia2.0凭借通用模块化框架、场景资产自动化生成、高效数据采集系统三大革新,进一步向通用化、多样化、易用化迈进。仅通过单一平台、简单代码输入,即可实现仿真环境中机器人灵活训练,提升数据采集效率,为研究者提供了“一站式”具身智能开发解决方案。

具身机器人和通用AI 817

apple游客下单逆向分析

Apple游客下单Cookies注册激活流程逆向分析与算法实现

吴秋霖的博客 2001

GDB——使用GDB查看栈帧信息

当我们阅读代码和查找BUG时,往往有一个烦恼。就是我们不知道函数的调用顺序。而这些函数调用顺序对应我们理解程序结构,程序运行过程是很有帮助的。 那么问题是:程序的调用过程往往是很复杂的,而且可能是多层嵌套,跨文件调用的。这时候如果靠人工去查找,这将是一件非常大工作量的事情。GDB中有办法帮助我们做到查看函数调用的过程吗? 首先我们需要知道,函数调用信息存放在哪?只有知道函数调用信息,我...

食梦者 3万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

gdb查看php,GDB查看栈信息

使用 GDB 调试程序时,当程序发生中断,我们首先应该知道程序在哪里产生中断以及产生中断的原因是什么?函数发生调用时,相关的调试信息就已经产生,并且被存储在一块被称为栈帧的数据里。栈帧是在调用栈的内存区域里分配的,是调用栈划分的连续的区块,简称为栈。每个帧是一个函数调用另一个函数的相关数据,包含了传递给本地用函数的参数,这个函数的本地变量和这个函数的执行地址。在函数开始的时候栈中只有一个帧,是 m...

weixin_39917090的博客 295

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

打印当前线程信息_GDB frame和backtrace命令:查看栈信息

当程序因某种异常停止运行时,我们要做的就是找到程序停止的具体位置,分析导致程序停止的原因。对于 C、C++ 程序而言,异常往往出现在某个函数体内,例如 main() 主函数、调用的系统库函数或者自定义的函数等。要知道,程序中每个被调用的函数在执行时,都会生成一些必要的信息,包括:函数调用发生在程序中的具体位置;调用函数时的参数;函数体内部各局部变量的值等等。这些信息会集中存储在一块称为“...

weixin_28947253的博客 1506

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

GDB 使用 (四)查看栈信息

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

1464

gdb查看栈帧信息

f | frame 查看当前所在栈,简略版. info f| info frame 查看当前的详细版,输出格式如下. 栈地址. 下一行位置和对应地址. 调用者信息. 当前栈的语言 参数首地址 本地变量首地址. 上下栈地址信息. 存储的寄存器信息. info f framenumber 查看某个栈帧的信息. info args [-q] 查看当前函数的参数,-q简洁版. info args [-q] [-t type_regexp] [regexp] 过滤. info locals [-q] 查看本地变量,-

rubikchen的博客 545

gdb(三)查看源代码和栈信息

一 查看源代码: (1)list命令打印程序源代码: *list :显示程序第linenum行周围的源程序。 *list :显示函数名为function的函数的源代码。 *list:显示当前行后面的源程序。 *list +:显示当前行后面的源程序。 *list -:显示当前行前面的源程序。 *list :显示从first到last行之间的源代码。 *list    ,:显示当前行

linux系统、网络编程和分布式计算 2389

gdb 查看是否 栈溢出_【Linux】GDB查看栈信息(转)

在调试程序的过程中,查看程序的函数调用堆栈是一项最基本的任务,几乎所有的图形调试器都支持这项特性。GDB调试器当然也支持这一特性,但是功能更加灵活和丰富。GDB将当前函数的栈帧编号为0,为外层函数的栈帧依次加1,这些编号将成为一些GDB命令的参数,以指明将要操作的是哪一个函数的栈帧。GDB还支持使用Address作为栈帧的标识符,可在栈帧编号被破坏的情况下使用。1.在栈帧之间切换GDB中有很多针对...

weixin_28958485的博客 516

gdb 笔记(08)— 查看栈回溯信息、切换栈帧、查看帧信息

当程序进行函数调用时,这些调用信息(比如在哪里调用等)称为栈帧。每一个栈帧的内容还包括调用函数的参数、局部变量等。所有栈帧组成的信息称为调用栈(或者调用堆栈)。当程序刚开始运行时,只有一个栈帧,即主函数 。每调用一个函数,就产生一个新的栈帧;当函数调用结束时(即从函数返回后),该函数的调用随之结束,该栈帧也结束。如果该函数是一个递归函数,则调用该函数会产生多个栈帧。查看栈回溯信息的命令是 。执行该栈回溯命令后,会显示程序执行到什么位置、包含哪些帧等信息。每一帧都有一个编号,从 0 开始。0 表示当前正在执

wohu1104的专栏 1万+

【Linux】GDB查看栈信息(转)

【Linux】GDB查看栈信息(转) 在调试程序的过程中,查看程序的函数调用堆栈是一项最基本的任务,几乎所有的图形调试器都支持这项特性。       GDB调试器当然也支持这一特性,但是功能更加灵活和丰富。       GDB将当前函数的栈帧编号为0,为外层函数的栈帧依次加1,这些编号将成为一些GDB命令的参数,以指明将要操作的是哪一个函数的栈帧。       GDB还支持使用Ad

zhoujunjun2013的博客 816
上一篇: linux环境内存分配原理
下一篇: Linux内存管理大图(第三稿)
unix21
博客等级 码龄14年 115粉丝 248原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值