c - sparc64 上的 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 garbage values>)
.... [other functions]

所以开始调用 bar,它调用 foo,我们在 foo 中崩溃了。问题是,堆栈中的那些值是在每个函数被调用时跟踪 %o1、..、%o5 寄存器的值,还是它们是当时 %i0、..、%i5 寄存器的值崩溃的原因(意味着如果函数更改了这些输入寄存器之一,堆栈跟踪中的值将不同)?

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

最佳答案

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

关于c - sparc64 上的 DBX 核心转储和堆栈跟踪输入/输出寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15506934/

相关文章:

c++ - 来自 CreateWindow/CreateDialog 的 HWND 是否可以从另一个线程获取消息?

c - 为什么程序的输出是不同的?

java - 读取COM端口值并在位于java面板内的textArea中打印

c - 使用汇编语言为 C 程序编写函数

c++ - 编译时未定义对 `__sync_val_compare_and_swap_4' 错误的引用,使用 gcc 4.1.1 和 4.2.0 作为 Sparc v8 目标

c - 将参数从 C 传递给程序集?

编译错误 : request member in something not a structure of union

php - 如何更改php文件的扩展名

php - 如何使用 PHPWord 在现有的 Word 文档上添加水印?

c - SPARC 和 x86 GCC 一个 C 代码的不同结果