1

我的程序在随机调用回调函数时因分段错误而崩溃。当我分析内核时,回调函数地址是 0x20202020。程序以信号 11 终止,分段错误。

#0  0x20202020 in ?? ()

(gdb) bt

#0  0x20202020 in ?? ()
#1  0xf775a8cf in my_function (parm_p=0x9b88020) at ../src/mewz.c:1395

(mqheader_p->mqh_callback)(mqheader_p->mqh_cbarg);

mqh_callback = 0x20202020,
mqh_cbarg = 0x20202020,

这是随机发生的。我理解0x20202020不是回调函数的有效地址,但是为什么这个回调函数地址随机指向一个无效地址。任何线索?

4

3 回答 3

2

回调函数指针可能已被覆盖,或者正在从甚至没有正确分配和初始化的内存中使用。

有点有趣的是,0x20 是空格字符的 ASCII 码。

要做的事情:

  1. 检查周围数据 mqheader_p点分配的代码。
  2. 在调试器中运行程序,并在函数指针上设置观察点。
于 2012-09-05T12:26:31.913 回答
2

我的猜测是缓冲区溢出。因为 0x20 恰好是 ASCII 空间,所以我认为这是覆盖地址的字符串的一部分。看看你对 sprintf 等的使用。

您可以在之前和之后记录内存,这可能会给您更多线索,哪个字符串可能被覆盖。

注意:0x20202020 是四个字节 0x20 0x20 0x20 0x20 或 4 个连续的空格字符。

于 2012-09-05T12:28:38.757 回答
0

要解决此类问题,我认为您可以在第一次初始化 mqh_callback 后打印出 mqh_callback 值,而另一个打印输出应该在您调用回调之前。另一种是在 mqh_callback 的地址上使用写断点。

这种错误可能来自一些指针技巧操作,例如缺少初始化、缓冲区溢出等。

于 2012-09-05T12:59:42.210 回答