[英]Get source code for libc for debugging in gdb
我目前正在使用 gdb 从共享库 libc6 调试 api
getaddrinfo()
这是从 python 模块调用的:
socket.getaddrinfo()
我设法在 getaddrinfo.c 处设置了一个断点,我希望通过单个步骤导航执行。
源文件:
ldd --version
告诉我有 glibc 2.19,我已经从这里下载了源代码
但是在使用 gdb 进行单步调试时,行号看起来并不匹配。
有没有更简洁的方法来下载 libc6 的源代码
PS:我是gdb调试的新手,请指出任何需要的信息。
Ubuntu 22.04 最小可运行示例
对于 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
然后获取源代码:
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
生成目录: glibc-2.35
。
然后我们制作一个 C hello world 来测试:
主要.c
#include <stdio.h>
int main(void) {
puts("hello");
}
并将 GDB 编译到其中:
gcc -ggdb3 -O0 -std=c99 -Wall -Wextra -pedantic -o main.out main.c
gdb -ex 'set substitute-path . glibc-2.35' main.out
然后将其测试为:
(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
“我们在”。
Ubuntu 的一些其他版本在绝对位置有来源,例如:
/tmp/build138741687/
在这种情况下你会想要:
set substitute-path /tmp/build138741687/ glibc-2.35
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.