繁体   English   中英

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

[英]DBX core dump on sparc64 and stack trace in/out registers

假设我有这些功能

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寄存器的值,但是一位客户最近升级了他们的硬件,并且有一个核心转储,其中堆栈跟踪中的参数之一看起来有问题。 调用者的反汇编看起来是正确的,甚至包括用于设置该特定参数的寄存器,我也检查了通常的类型不匹配,有符号/无符号等。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM