程序在调用回调函数时崩溃并出现分段错误

时间:2012-09-05 12:08:09

标签: c callback segmentation-fault

我的程序在随机调用回调函数时因Segmentation故障而崩溃。当我分析核心时,回调函数地址是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不是回调函数的有效地址,但为什么这个回调函数地址随机指向无效地址。任何线索?

3 个答案:

答案 0 :(得分:2)

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

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

要做的事情:

  1. 检查数据分配mqheader_p点的代码。
  2. 在调试器中运行程序,并在函数指针上设置观察点。

答案 1 :(得分:2)

我的猜测是缓冲超过运行。因为0x20恰好是ASCII空间,我认为这是覆盖地址的字符串的一部分。看看你特别使用sprintf之类的东西。

您可以在之前和之后记录内存,这可能会让您更多地了解哪个字符串可能会被覆盖。

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

答案 2 :(得分:0)

为了解决这类问题,我认为你可以在第一次启动mqh_callback后打印出mqh_callback值,另一次打印输出应该在你调用回调之前。 Aonther是在mqh_callback的地址上使用写断点。

这种错误可能来自某些指针技巧操作,例如缺少启动,缓冲区溢出等。