使用gdb调试回调

问题描述 投票:2回答:1

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

例如,我从pcap_loop库调用libpcap,它希望指向我的回调函数got_packet

 pcap_loop(handle, num_packets, got_packet, NULL);

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

c gdb function-pointers
1个回答
1
投票

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

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

如果您使用的是来自操作系统存储库的库,那么您可能会发现可以安装“调试”软件包。这将允许您进入库代码并可能解决问题的方式。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.