如何在库中调试?

How to debug inside a library?

我正在编写一个将具有 ncurses TUI 的程序,在一个函数中我使用了导致问题的 werase(WINDOW * win) 函数。该函数不会 return ERROK 因为它导致了分段错误。我想知道的是如何查看函数声明中发生的事情。我正在使用 gdb 并启用 set step-mode on 并设法在 werase 上按 s 进入库,但是,gdb 输出如下内容:

0x00007ffff7b8fc4b in werase () from /usr/lib/libncursesw.so.5

(gdb)

然后,在几秒的击键之后:

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7b8fc60 in werase () from /usr/lib/libncursesw.so.5

(gdb)

我如何让 gdb 输出在函数声明中读取的行,而不仅仅是该行的内存地址?

附加信息

(gdb) info sharedlibrary
From                To                  Syms Read   Shared Object Library
0x00007ffff7ddbb80  0x00007ffff7df52f0  Yes (*)     /lib64/ld-linux-x86-64.so.2
0x00007ffff7b8b000  0x00007ffff7bbff38  Yes (*)     /usr/lib/libncursesw.so.5
0x00007ffff77f24d0  0x00007ffff791eee4  Yes (*)     /usr/lib/libc.so.6
(*): Shared library is missing debugging information.
(gdb) sharedlibrary libncursesw
Symbols already loaded for /usr/lib/libncursesw.so.5

我发现我必须用 -lncurses_g 或 -lcurses_g 编译,我已经完成了,除了 /usr/bin/ld: cannot find -lcurses_g 没有其他结果。似乎我的系统中没有安装调试信息,但我不知道为什么。我正在使用 Arch linux.

很可能库没有问题,您正在向它传递错误数据,例如已经释放的指针或指向已被覆盖的内存的指针。在 valgrind 下尝试 运行 你的程序,看看它是否告诉你错误在哪里。

如果您必须调试到库中,ncurses 是开源的,因此您可以从源代码下载并自行构建它并进行调试,并 link 针对您自己的副本。这将为您提供库中的完整源代码级调试。