获取 libc 的源代码以便在 gdb 中进行调试

Abh*_*wal 6 c debugging gdb glibc

我目前正在使用 gdb 调试共享库 libc6 中的 api

getaddrinfo()

这是从 python 模块调用的:

socket.getaddrinfo()

我已设法在 getaddrinfo.c 处设置断点,并且希望以单步方式导航执行。

源文件:

ldd --version

告诉我我有 glibc 2.19,并且我已经从这里下载了源代码

http://ftp.gnu.org/gnu/libc/

但是在使用gdb进行单步调试时,看起来行号不匹配。

有没有更干净的方法来下载 libc6 的源代码

PS:我是 gdb 调试的新手,请指出任何需要的信息。

Cir*_*四事件 1

Ubuntu 22.04 最小可运行示例

另请参阅:https://askubuntu.com/questions/487222/how-to-install-debug-symbols-for-installed-packages/1434174#1434174

对于 glibc,调试符号似乎已经预先安装,否则我们需要通过以下方式获取它们:

printf "deb http://ddebs.ubuntu.com %s main restricted universe multiverse\n" $(lsb_release -cs){,-updates,-security,-proposed} | \
 sudo tee -a /etc/apt/sources.list.d/ddebs.list
sudo apt install ubuntu-dbgsym-keyring
sudo apt update
sudo apt install coreutils-dbgsym
sudo apt install libc6-dbg
Run Code Online (Sandbox Code Playgroud)

然后获取源代码:

sudo cp /etc/apt/sources.list /etc/apt/sources.list~
sudo sed -Ei 's/^# deb-src /deb-src /'
/etc/apt/sources.list sudo apt-get update
apt source libc6
Run Code Online (Sandbox Code Playgroud)

它产生目录:glibc-2.35.

然后我们创建一个 C hello world 来测试:

主程序

#include <stdio.h>

int main(void) {
    puts("hello");
}
Run Code Online (Sandbox Code Playgroud)

并使用以下命令编译和 GDB 到其中:

gcc -ggdb3 -O0 -std=c99 -Wall -Wextra -pedantic -o main.out main.c
gdb -ex 'set substitute-path . glibc-2.35'  main.out
Run Code Online (Sandbox Code Playgroud)

然后测试它:

(gdb) start
Temporary breakpoint 1 at 0x1151: file main.c, line 4.
Starting program: /home/ciro/tmp/main.out 
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

Temporary breakpoint 1, main () at main.c:4
4           puts("hello");
(gdb) s
__GI__IO_puts (str=0x555555556004 "hello") at ./libio/ioputs.c:33
33      {
(gdb) l
28      #include <string.h>
29      #include <limits.h>
30
31      int
32      _IO_puts (const char *str)
33      {
34        int result = EOF;
35        size_t len = strlen (str);
36        _IO_acquire_lock (stdout);
37
Run Code Online (Sandbox Code Playgroud)

“我们进来了”。

Ubuntu 的其他一些版本的源代码位于绝对位置,例如:

/tmp/build138741687/
Run Code Online (Sandbox Code Playgroud)

在这种情况下你会想要:

set substitute-path /tmp/build138741687/ glibc-2.35
Run Code Online (Sandbox Code Playgroud)