假设我有这些功能
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 寄存器的值崩溃的原因(意味着如果函数更改了这些输入寄存器之一,堆栈跟踪中的值会不同)?
我问的原因是因为我认为这是输出寄存器的值,但是客户最近升级了他们的硬件并且有一个核心转储,其中堆栈跟踪中的一个参数看起来有问题。调用者的反汇编看起来是正确的,即使是用于设置该特定参数的寄存器,我已经检查了通常的类型不匹配、有符号/无符号等。