1

假设我有这些功能

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 寄存器的值崩溃的原因(意味着如果函数更改了这些输入寄存器之一,堆栈跟踪中的值会不同)?

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

4

1 回答 1

0

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

于 2013-03-19T21:53:34.000 回答