gpt4 book ai didi

linux - 我如何知道哪个地址属于故障转储中函数的哪个参数

转载 作者:太空狗 更新时间:2023-10-29 12:01:34 25 4
gpt4 key购买 nike

我是故障转储分析的新手。这是我的 vmcore 的 bt -f 的输出,我想查看它当时持有的函数 foo 的参数值。我有一台 64 位机器,浏览代码后我发现 foo 只接受一个参数。无论如何,有没有办法知道哪个地址属于哪个参数。

#4 [ffff8807adfaf8c0] foobar at ffffffffa11c7c15 [foo]
ffff8807adfaf8c8: ffff881033e1d800 ffff8807adfaf8e8
ffff8807adfaf8d8: ffff8807adfaf938 ffffffffa11c7ce1

这是最后的寄存器值

RIP: 00007fa64fdfb907  RSP: 00007fff2a187ca0  RFLAGS: 00010246
RAX: 00000000000000a6 RBX: ffffffff8100b072 RCX: 00007fa6506f7390
RDX: 0000000000000000 RSI: 0000000000000000 RDI: 00007fa6508fe910
RBP: 00007fa6508fe8f0 R8: 00007fa6508fe930 R9: 0000000000000000
R10: 00007fff2a1884b0 R11: 0000000000000246 R12: 0000000000000000
R13: 0000000000000000 R14: 0000000000000000 R15: 00007fa6508fe990
ORIG_RAX: 00000000000000a6 CS: 0033 SS: 002b

最佳答案

foobar() 的参数可能是在寄存器中传递的,因此它可能根本不存在于任何内存地址。参数的类型将决定它是在寄存器中还是在内存中传递。

您在评论中提到该函数的原型(prototype)是:

static void foobar(struct bar *b)

因此,第一个参数是常规 INTEGER 类型(由 x86_64 ABI 定义;这包括指针)。要找到该指针参数的值,您需要查看 foo 函数从入口点到当前指令的反汇编(即 RIP).该值将传递给 %rdi 中的函数。

但是,%rdi 中的值可能已在函数入口和发生转储的指令之间被覆盖或修改。在这种情况下,您可能需要做一些侦探工作以回溯并找到最初通过的论点。

作为一般方法,我建议:

  • 获取函数的反汇编,从入口点到显示的 RIP

  • 看看 %rdi 在反汇编中是如何使用的。有什么东西修改了%rdi吗?是否有任何函数调用(它们本身可能会覆盖 %rdi 值)。如果不是,您的参数是 00007fa6508fe910

  • 如果 %rdi 被修改,查看是否已复制到另一个寄存器,或保存在堆栈中。如果不是,请查看调用者如何通过反汇编生成该指针。

关于linux - 我如何知道哪个地址属于故障转储中函数的哪个参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33931247/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com