gpt4 book ai didi

c - 使用 gdb 调试回调

转载 作者:太空宇宙 更新时间:2023-11-03 23:53:02 25 4
gpt4 key购买 nike

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

例如,我从 libpcap 库调用 pcap_loop,它需要一个指向我的回调函数 got_packet 的指针。

 pcap_loop(handle, num_packets, got_packet, NULL);

一旦我使用 gdb 进入或越过这一行,我在 got_packet 中的断点就永远不会被击中。
为什么?
有什么想法吗?

最佳答案

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

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

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

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

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

关于c - 使用 gdb 调试回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14940871/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com