gpt4 book ai didi

c - 共享库中的段错误。如何调试?

转载 作者:太空狗 更新时间:2023-10-29 15:36:32 27 4
gpt4 key购买 nike

我在我的程序中使用了一个库 (libnids)。我从库中调用函数 nids_run,它会继续运行,直到我明确调用 nids_exit。

我的程序处理 SIGINT 并调用 nids_exit。中断处理程序正常返回,但有时在库将控制权返回给我的程序之前,我会收到一个段错误。这是 GDB 给我的回溯:

#0  0x00007ffff6498b2a in ?? () from /usr/lib/libpcap.so.1
#1 0x00007ffff649bee1 in pcap_loop () from /usr/lib/libpcap.so.1
#2 0x00007ffff77bae66 in nids_run () from /usr/lib/libnids.so.1.24
#3 0x0000000000401e92 in main (argc=3, argv=0x7fffffffebf8) at eve.c:139

找到问题的最佳策略是什么?我应该以某种方式调试 libpcap 吗?

更新:正如 ArjunShankar 所建议的,我在 Valgrind 下运行我的程序。这是输出的一部分:

==7504== Invalid read of size 4
==7504== at 0x654EDC1: ??? (in /usr/lib/libpcap.so.1.2.1)
==7504== by 0x6551EE0: pcap_loop (in /usr/lib/libpcap.so.1.2.1)
==7504== by 0x5250E65: nids_run (in /usr/lib/libnids.so.1.24)
==7504== by 0x401E91: main (eve.c:139)
==7504== Address 0x70eece8 is 40 bytes inside a block of size 768 free'd
==7504== at 0x4C29A9E: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==7504== by 0x5250DEB: nids_exit (in /usr/lib/libnids.so.1.24)
==7504== by 0x4026D0: signal_handler (signalhandling.c:17)
==7504== by 0x5B6313F: ??? (in /lib/libpthread-2.15.so)
==7504== by 0x5B5FC60: pthread_cond_timedwait@@GLIBC_2.3.2 (in /lib/libpthread-2.15.so)
==7504== by 0x58E37D4: g_cond_wait_until (in /usr/lib/libglib-2.0.so.0.3200.1)
==7504== by 0x587E2C0: ??? (in /usr/lib/libglib-2.0.so.0.3200.1)
==7504== by 0x587E909: g_async_queue_timeout_pop (in /usr/lib/libglib-2.0.so.0.3200.1)
==7504== by 0x4022D2: analyzer_thread_func (analyzers.c:93)
==7504== by 0x58CA0C4: ??? (in /usr/lib/libglib-2.0.so.0.3200.1)
==7504== by 0x5B5BE0D: start_thread (in /lib/libpthread-2.15.so)

可以在以下位置找到更多输出:http://pastebin.com/93gkSScS

最佳答案

Valgrind 输出显示 libpcap(从 nids_run 内部)尝试在 nids_exit free 之后读取内存位置他们:

例如:

==7504== Invalid read of size 4
==7504== at 0x654EDC1: ??? (in /usr/lib/libpcap.so.1.2.1)
==7504== by 0x6551EE0: pcap_loop (in /usr/lib/libpcap.so.1.2.1)
==7504== by 0x5250E65: nids_run (in /usr/lib/libnids.so.1.24)

Address 0x70eece8 is 40 bytes inside a block of size 768 free'd
==7504== at 0x4C29A9E: free
==7504== by 0x5250DEB: nids_exit (in /usr/lib/libnids.so.1.24)

所以这是一个 768 大小的 block ,在 nids_exitfreed,随后在 nids_run 中读取(显然还没有停止还没有)。

所有其他错误都类似(nids_exit free一个 block ,nids_run 继续尝试使用它。

这意味着:您没有正确使用 libnids (nids_run/nids_exit),或者 libnids 中存在错误.

关于c - 共享库中的段错误。如何调试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10478953/

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