【发布时间】:2015-04-11 17:25:32
【问题描述】:
我正在尝试在 ARM 架构上调试进程核心转储。
这是一个用C语言编写的电信栈软件。进程是单线程的。
通过 gdb 进行的一些调试表明堆栈参数(局部变量或函数参数)是从与正确位置相距固定偏移量(8 字节)的内存位置读取的。
这里是一些调试信息:
(gdb) p localParam_p
$16 = (UInt8 *) 0xbe <Address 0xbe out of bounds>
(gdb) x /16wx &localParam_p
0x7ea5c774: 0x000000be 0x00000010 0x94dc788c 0x00000000
正确的(预期的)值是 0x94dc788c,它存储在内存位置 0x7ea5c77c(上面输出中的第三个字)
这是另一个例子:
(gdb) p localParam2
$18 = 0
(gdb) x /16wx &localParam2
0x7ea5c770: 0x00000000 0x000000be 0x00000010 0x94dc788c
addrLen 的预期值为 0x10(上面的第三个字)。
我可以看到与堆栈帧中的其他局部变量相同的问题。
请帮忙!
Valgrind 不能在这个系统上使用。
该过程在几天内仅崩溃过一次,重现步骤尚不清楚。
【问题讨论】:
-
我们究竟应该为您提供哪些帮助?代码在哪里?你知道,我们不是espers。
-
我正在寻找进一步调试的提示/方向。
-
8 字节还是 8 位?但是
p localParam_p打印地址0x7ea5c774的值是正确的,对吧?指针localParam_p应该在0x7ea5c774的下一个字节处打印值是什么意思 -
如果你想要一个提示,也许你应该寻找一个使用错误参数调用的函数。如果你的原型/包含没有正确完成,编译器不会警告你。这就是为什么你总是把原型放在一个 .h 中,你同时包含在函数 .c 和调用者 .c 中。
-
8 个字节。
p localParam_p打印地址0x7ea5c774的值不正确。正确的值存储在0x7ea5c77c
标签: c gdb stack arm corruption