0

gdb を使用してプログラムをデバッグしていますが、メッセージを解凍して印刷したいときに問題が発生しました。ターミナルのコマンドラインから印刷できるようですが、プログラムがに行くとprintf("%d has received msg: ", msg->connid);問題が発生し、

Program received signal SIGSEGV, Segmentation fault.
    0xb7ff6301 in ?? () from /lib/ld-linux.so.2

(gdb)n
154     LSPMessage* msg = lspmessage__unpack(NULL, msg_len, buf);
(gdb) n
156     memcpy(pld, msg->payload.data, msg->payload.len);
(gdb) p msg->payload.data
$1 = (uint8_t *) 0x804c038 "Connectedrt,\031"
(gdb) p msg->connid
$2 = 1
(gdb) p msg->payload.len
$3 = 9
174     printf("%d has received msg: ", msg->connid);  // required field
(gdb) n
Program received signal SIGSEGV, Segmentation fault.
0xb7ff6301 in ?? () from /lib/ld-linux.so.2
4

1 に答える 1

0

あなたは、実際に何を求めているのかを説明するという非常に貧弱な仕事をしました。

あなたの質問は、「私の printf 呼び出しがクラッシュするのはなぜですか?」だと思います。

いくつかの理由が考えられます

  • 以前に破損しstdoutた、または
  • msg->connidではありませんint(したがってprintf"%d"、または
  • ランタイムローダーの状態で何か他のものを破損し、遅延 PLT シンボル解決を実行中にクラッシュするようになりました

クラッシュはランタイムローダー内にあるため、最後の原因が最も可能性が高いようです。この仮説は、ローダーがシンモール解決を非遅延で実行するように強制することで確認できます。

(gdb) set env LD_BIND_NOW 1
(gdb) run

それでもクラッシュしましたか?そうでない場合は、Valgrind でプログラムを実行し、報告されたすべての問題を必ず修正してください。

于 2013-02-08T04:06:20.403 に答える