GDB怎么从栈帧查看函数参数

千宇酱_4417

千宇酱_4417

2026-09-13

942人浏览

原创

info args 是查看当前栈帧函数参数最直接可靠的方式,需确保编译时加 -g 且未优化;失效时可查寄存器(如 %rdi)或 arglist 地址处的栈内存,跨帧需先 frame 切换。

gdb怎么从栈帧查看函数参数

用 info args 直接看当前栈帧的函数参数

这是最直接、最可靠的方式。GDB 在符号信息完整(即编译时加了 -g)的前提下,能准确解析出当前栈帧中传入的实参值。info args 不依赖你是否记得变量名,也不需要手动查寄存器或内存地址,它直接按函数声明顺序列出所有参数及其值。

常见错误现象:运行 info args 后显示 No arguments. 或只显示部分参数——大概率是没在函数入口处停住,或者编译时没带 -g,导致调试信息缺失。

  • 确保程序用 gcc -g 编译,例如:gcc -g -o test test.c
  • 在目标函数第一行设断点,比如 break func1,再 run,这样停在函数刚进入、参数已加载但局部变量可能还未初始化的位置
  • 如果函数是内联的或被优化掉(如用了 -O2),info args 可能失效;务必关闭优化:gcc -g -O0

当 info args 失效时,查寄存器或栈内存

64 位 Linux(x86_64)下,前 6 个整型/指针参数依次放在 %rdi、%rsi、%rdx、%rcx、%r8、%r9;浮点参数走 %xmm0–%xmm7。超过 6 个的参数会压栈(在调用者的栈帧里),需结合 info frame 看栈基址再偏移读取。

容易踩的坑:直接 x/4xw $rsp 往往看不到参数,因为栈顶可能已被函数 prologue(如 push %rbp、sub <p>容易踩的坑:直接 <code>x/4xw $rsp 往往看不到参数,因为栈顶可能已被函数 prologue(如 push %rbp、sub $0x10,%rsp)改写;正确做法是先用 info frame 找到 Save registers: 区域或 Arglist at 提示的地址,再从那里开始查。

x10,%rsp)改写;正确做法是先用 info frame 找到 Save registers: 区域或 Arglist at 提示的地址,再从那里开始查。

C++ Code Review Master
C++ Code Review Master

组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。

下载
  • 执行 info frame,关注输出中类似 Arglist at 0x7fffffffe3a0, args: int a, int b, int c 的行
  • 若没显式给出 Arglist at,用 info registers rdi rsi rdx rcx r8 r9 查前 6 个
  • 对第 7 个及以后的参数,用 x/4xw 0x7fffffffe3a0+24 这类偏移(具体偏移量取决于参数类型和对齐)

backtrace full 能顺带看到部分参数,但不全也不稳定

bt full 会在每个栈帧行末括号里打印识别出的参数值,比如 #0 func1 (a=10) at test.c:5。但它依赖符号表质量与 GDB 解析能力,对复杂类型(结构体、数组)、优化后代码或无调试信息的二进制基本无效。

性能影响几乎为零,但别把它当主力方案——它只是辅助线索,不是权威来源。真要确认参数值,还是回到 info args 或寄存器/内存查证。

  • 仅用于快速扫一眼“大概传了啥”,尤其在崩溃后用 gdb ./prog core 加载 core 文件时
  • 若括号里显示 a=<optimized out></optimized>,说明该参数被编译器优化掉了,此时必须关优化重编译才能看到
  • 不要依赖它判断指针指向的内容,它只显示指针本身的值(如 buf=0x7fffffffe420),不展开内存

跨栈帧查看其他函数的参数要用 frame 切换

每个栈帧独立保存自己的参数和局部变量。info args 永远只作用于当前帧。想看 func2 调用 func1 时传了什么,得先 up 切到 func2 帧,再 info args。

容易忽略的关键点:调用链越深,帧编号越大(frame 0 是当前,frame 1 是它的调用者),但 up 是向上走(往调用者方向),down 是向下走(往被调用者方向)——这个方向和编号数字增减是反的,新手常搞混。

  • 用 bt 先看清调用链层级和帧编号
  • 用 frame 2 或 up 2 快速跳转,比连按多次 up 更稳
  • 切帧后务必再执行一次 info args,别假设上一帧的结果还有效

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

5087

5

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.10

2268

6

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

2026.09.30

80

10

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

2026.09.30

80

14

LLVM IR中间表示入门指南
LLVM IR中间表示入门指南

本专题整理LLVM IR的核心概念,包括中间表示作用、模块结构、函数、基本块、SSA形式、类型系统和常见语法,帮助新手理解LLVM编译流程中的关键层。

2026.09.30

40

12

PDF转图片方法
PDF转图片方法

需要把 PDF 页面用于上传、预览、分享或图片归档时,PDF 转图片方法专题整理 JPG/PNG 格式选择、逐页导出、清晰度设置、批量下载和结果检查等流程,帮助用户稳定完成 PDF 图片化处理。

2026.09.30

40

26

PixTV AI视频生成与无限画布创作
PixTV AI视频生成与无限画布创作

PixTV专题整理AI视频与视觉内容创作相关功能使用教程,涵盖AI生图、视频生成、无限画布、多模型创作、素材管理、声音音乐及视频剪辑等功能,帮助用户快速掌握PixTV从创意到成片的完整制作方法。

2026.09.29

60

15

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

2026.09.23

280

15

Buffalo框架路由与请求处理实操指南
Buffalo框架路由与请求处理实操指南

本专题讲解Buffalo框架路由与请求处理机制,涵盖路由注册与分组、资源路由、Handler编写规范、Context上下文方法、参数绑定、中间件编写挂载、Session与Cookie读写、Flash消息及错误页面定制方法。

2026.09.23

160

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ 手册教程
C++ 手册教程

共41课时 | 78.1万人学习

Conan 2 Essentials 免费课程
Conan 2 Essentials 免费课程

共0课时 | 0人学习

CMake 与 Conan 集成实践
CMake 与 Conan 集成实践

共0课时 | 0人学习