linux – 使用崩溃实用程序在堆栈上查找局部变量
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了linux – 使用崩溃实用程序在堆栈上查找局部变量,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2754字,纯文字阅读大概需要4分钟。
内容图文
![linux – 使用崩溃实用程序在堆栈上查找局部变量](/upload/InfoBanner/zyjiaocheng/954/218144d6ff9d4a3392a9d308959de1d7.jpg)
我正在使用崩溃实用程序来anaylze vmcore(linux)结果,但我发现在函数中提取局部变量值有困难.谷歌搜索相同的说,可以使用“信息本地”,但当我使用它,它说命令没有找到.
搜索了一段时间后,发现下面的链接说明这种支持存在于崩溃购买自编译中.
http://www.redhat.com/archives/crash-utility/2009-May/msg00003.html
是否有任何指针用于在vmcore转储中提取局部变量?
解决方法:
请看这篇描述x86堆栈框架布局的文章:
http://eli.thegreenplace.net/2011/09/06/stack-frame-layout-on-x86-64/
如果您正在寻找函数参数,请注意参数1-6通过寄存器(rdi,rsi,..)传递,参数7- ..在堆栈上传递.
所以根据定义,很容易看到参数7-的值 – 只是转储堆栈上下文:
碰撞> bt -f
…
#6 [ffff88107fc23e08] delayed_work_timer_fn at ffffffff8108a060
ffff88107fc23e10: ffff88107fc23e50 **ffffffff8107e329** <-- return address
#7 [ffff88107fc23e18] call_timer_fn at **ffffffff8107e329**
ffff88107fc23e20: ffff88101dc6d660 ffff881020f44000
ffff88107fc23e30: ffff88101dc6d660 ffff88107fc23e90
ffff88107fc23e40: ffff881020f45020 ffffffff8108a030
ffff88107fc23e50: ffff88107fc23ed0 ffffffff8107e739
请参阅链接.参数7- ..将被推送到返回地址下面的堆栈(这里我们没有这样的参数).
对于通过寄存器传递的参数1-6,您必须反汇编调用函数代码并遵循它们获取值的方式.大多数情况下,您会看到他们从另一个寄存器中获取价值.你试图找到的是在某个时刻从堆栈读取的值.这是一个例子:
0xffffffff8107e723 <run_timer_softirq+307>: sti
0xffffffff8107e724 <run_timer_softirq+308>: nopw 0x0(%rax,%rax,1)
0xffffffff8107e72a <run_timer_softirq+314>: mov -0x48(%rbp),%rdx <-- rdx = rbp[-0x48] <-- rdx is from the stack!!!
0xffffffff8107e72e <run_timer_softirq+318>: mov %r12,%rdi
0xffffffff8107e731 <run_timer_softirq+321>: mov %r15,%rsi
0xffffffff8107e734 <run_timer_softirq+324>: callq 0xffffffff8107e2e0 <call_timer_fn>
static void call_timer_fn(struct timer_list *timer, void (*fn)(unsigned long),
unsigned long data)
所以’call_timer_fn’第三个参数(rdx)就是我们在位置rbp [-0x48]的’call_timer_fn’堆栈中所拥有的…
这很棒…
如果不是这种情况,那么你必须继续调用跟踪&汇编(:-()直到你到达寄存器已知的第一个位置:
#14 [ffff88107fc23fb0] apic_timer_interrupt at ffffffff81515e33
--- <IRQ stack> ---
#15 [ffff881020f75da8] apic_timer_interrupt at ffffffff81515e33
[exception RIP: intel_idle+193]
RIP: ffffffff812bce31 RSP: ffff881020f75e58 RFLAGS: 00000202
RAX: 0000000000000000 RBX: ffff88107fc2e3c0 RCX: 0000000000000000
RDX: 0000000000007cd0 RSI: 0000000000000000 RDI: 0000000001e78df8
RBP: ffff881020f75ea8 R8: 0000000000004183 R9: 000000000000003b
R10: 000000a89c12c7e8 R11: 0000000000000001 R12: ffffffff81515e2e
R13: ffff88107fc2e500 R14: 0000000000000000 R15: ffff88107fc2e3c0
ORIG_RAX: ffffffffffffff10 CS: 0010 SS: 0018
有关本地函数变量,请参阅链接.如果没有优化,它们会被推入堆栈.如果可以,我建议禁用优化.现在你应该能够从堆栈中获取它们.
内容总结
以上是互联网集市为您收集整理的linux – 使用崩溃实用程序在堆栈上查找局部变量全部内容,希望文章能够帮你解决linux – 使用崩溃实用程序在堆栈上查找局部变量所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。