假设我有这些功能
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寄存器的值崩溃(意思是如果函数改变了这些输入寄存器之一,堆栈跟踪中的值会不同)?
我问的原因是因为我认为这是out寄存器的值,但是客户最近升级了他们的硬件并且有一个核心转储,其中堆栈跟踪中的一个参数看起来有问题。调用者的反汇编看起来是正确的,甚至是用于设置该特定参数的寄存器,并且我检查了通常的类型不匹配,签名/未签名等等。
答案 0 :(得分:0)
堆栈跟踪通常显示每次调用的堆栈帧转储(请原谅重言式)。函数参数后跟返回地址,指向前一个堆栈帧的指针等。这些是垃圾值。有关堆栈布局的确切详细信息,您可以使用类似“AIX调用约定”的内容。 生成核心转储时,无法确定调用函数时堆栈上的值是什么。你会看到崩溃时的值。因此,如果函数为形式参数分配新值或者由于错误而覆盖了参数(如溢出堆栈缓冲区),则值将与调用时的值不同。