gpt4 book ai didi

c - sparc64 上的 DBX 核心转储和堆栈跟踪输入/输出寄存器

转载 作者:太空宇宙 更新时间:2023-11-04 04:50:54 24 4
gpt4 key购买 nike

假设我有这些功能

void foo(int a, int b, int c);
void bar(int d);
void start();

我得到一个核心转储,看起来像这样

foo(<value of a>, <value of b>, <value of c>, <three garbage values>)
bar(<value of d>, <five garbage values>)
start(<six garbage values>)
.... [other functions]

所以开始调用 bar,它调用 foo,我们在 foo 中崩溃了。问题是,堆栈中的那些值是在每个函数被调用时跟踪 %o1、..、%o5 寄存器的值,还是它们是当时 %i0、..、%i5 寄存器的值崩溃的原因(意味着如果函数更改了这些输入寄存器之一,堆栈跟踪中的值将不同)?

我问的原因是因为我认为这是输出寄存器的值,但一位客户最近升级了他们的硬件并且有一个核心转储,其中堆栈跟踪中的参数之一看起来有问题。调用者的反汇编看起来是正确的,甚至是用于设置该特定参数的寄存器也是如此,而且我已经检查了通常的类型不匹配、有符号/无符号等。

最佳答案

堆栈跟踪通常显示每次调用的堆栈帧转储(请原谅重言式)。函数参数后跟返回地址、指向前一个堆栈帧的指针等。这些是你的垃圾值。有关堆栈布局的确切详细信息,您可以在谷歌上搜索“AIX 调用约定”之类的内容。生成核心转储时,无法判断调用函数时堆栈上的值是什么。您会看到崩溃时的值。因此,如果函数为形式参数分配了一个新值,或者参数由于错误(如堆栈缓冲区溢出)而被覆盖,则值将与调用时的值不同。

关于c - sparc64 上的 DBX 核心转储和堆栈跟踪输入/输出寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15506934/

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