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 回答