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

sparc64上的DBX核心转储和堆栈跟踪输入/输出寄存器,c,core,sparc,dbx,C,Core,Sparc,Dbx,假设我有这些函数 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

假设我有这些函数

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]
foo(,)
条(,)
开始()
.... [其他职能]
所以一开始叫酒吧,叫做foo,我们在foo坠毁了。问题是,堆栈跟踪中的这些值是调用每个函数时%o1,…,%o5寄存器的值,还是崩溃时%i0,…,%i5寄存器的值(这意味着如果函数更改了其中一个输入寄存器,堆栈跟踪中的值将不同)


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

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