调用回调函数时,c程序因分段错误而崩溃



我的程序在随机调用回调函数时因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不是回调函数的有效地址,但为什么这个回调函数地址随机指向无效地址。有线索吗?

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

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

注意:0x20202020是四个字节0x20 0x20 0x200x20或一行中的4个空格字符。

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

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

要做的事情:

  1. 检查位于的数据mqheader_p点的分配周围的代码
  2. 在调试器中运行程序,并在函数指针上设置监视点

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

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

相关内容

  • 没有找到相关文章

最新更新