我的程序在随机调用回调函数时因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码,这有点有趣。
要做的事情:
- 检查位于的数据
mqheader_p
点的分配周围的代码 - 在调试器中运行程序,并在函数指针上设置监视点
要解决此类问题,我认为您可以在第一次初始化mqh_callback之后打印出mqh_cullback值,另一次打印应该在调用callback之前。另外就是在mqh_callback的地址上使用写断点。
这种错误可能来自一些指针技巧操作,如初始化失败、缓冲区溢出等。