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 は、4 バイトの 0x20 0x20 0x20 0x20 または 4 つのスペース文字が連続したものです。

于 2012-09-05T12:28:38.757 に答える
0

このような問題のバグを修正するには、mqh_callback の最初の初期化後に mqh_callback の値を出力し、コールバックを呼び出す直前にもう一度出力する必要があると思います。もう 1 つは、mqh_callback のアドレスに書き込みブレークポイントを使用することです。

この種のエラーは、初期化の欠落、バッファオーバーフローなどのポインタトリック操作から発生する可能性があります。

于 2012-09-05T12:59:42.210 に答える