如何在库中调试?
How to debug inside a library?
我正在编写一个将具有 ncurses TUI 的程序,在一个函数中我使用了导致问题的 werase(WINDOW * win)
函数。该函数不会 return ERR
或 OK
因为它导致了分段错误。我想知道的是如何查看函数声明中发生的事情。我正在使用 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 针对您自己的副本。这将为您提供库中的完整源代码级调试。
我正在编写一个将具有 ncurses TUI 的程序,在一个函数中我使用了导致问题的 werase(WINDOW * win)
函数。该函数不会 return ERR
或 OK
因为它导致了分段错误。我想知道的是如何查看函数声明中发生的事情。我正在使用 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 针对您自己的副本。这将为您提供库中的完整源代码级调试。