2

我正在尝试使用gdb调试一个 C 程序,该程序一切正常,直到我将一个指针传递给一个函数(到第三方库),之后gdb失去焦点并且程序运行而没有在我的回调函数中遇到我的断点。

例如,我pcap_looplibpcap库中调用,该库需要一个指向我的回调函数的指针got_packet

 pcap_loop(handle, num_packets, got_packet, NULL);

一旦我踏入或越过这条线,gdb我的断点got_packet就永远不会被击中。
为什么 ?
有任何想法吗?

4

1 回答 1

1

在某些情况下可以跳过 GDB 断点,尤其是在调试启用优化的编译代码时,但最可能的答案是库函数没有按照您的预期执行。

GDB 无法进入没有调试信息的库,因此它只是看起来“失去焦点”,正如您所说,在返回点设置一个临时断点并等待函数完成。这仍然不应该阻止回调内的断点触发。

如果您使用的是来自操作系统存储库的库,那么您可能会发现可以安装一个“调试”包。这将允许您进入库代码并可能找出问题所在。

printf但是,添加调试或以某种方式“破坏”got_packet函数会导致信号 ( *(int *)0 = 1) 并以这种方式满足自己,无论它是否被调用,通常要简单得多。

如果您可以证明该函数确实被调用,并且 GDB 确实没有捕获断点,那么您就有了 GDB 错误(或者可能是内核错误)。

于 2013-02-18T17:00:54.177 回答