我的程序在随机调用回调函数时因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不是回调函数的有效地址,但为什么这个回调函数地址随机指向无效地址。任何线索?
答案 0 :(得分:2)
回调函数指针可能已被覆盖,或者正在从内存中使用,甚至没有正确分配和初始化。
有趣的是,0x20是空格字符的ASCII码。
要做的事情:
mqheader_p
点的代码。答案 1 :(得分:2)
我的猜测是缓冲超过运行。因为0x20恰好是ASCII空间,我认为这是覆盖地址的字符串的一部分。看看你特别使用sprintf之类的东西。
您可以在之前和之后记录内存,这可能会让您更多地了解哪个字符串可能会被覆盖。
注意:0x20202020是四个字节0x20 0x20 0x20 0x20或连续4个空格字符。
答案 2 :(得分:0)
为了解决这类问题,我认为你可以在第一次启动mqh_callback后打印出mqh_callback值,另一次打印输出应该在你调用回调之前。 Aonther是在mqh_callback的地址上使用写断点。
这种错误可能来自某些指针技巧操作,例如缺少启动,缓冲区溢出等。