首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取libc的源代码,以便在gdb中调试。

获取libc的源代码,以便在gdb中调试。
EN

Stack Overflow用户
提问于 2018-01-27 14:04:14
回答 1查看 3.1K关注 0票数 5

我目前正在使用gdb从共享库libc6调试api。

getaddrinfo()

它正在从python模块调用:

socket.getaddrinfo()

我已经设法在getaddrinfo.c设置了一个断点,并且我希望在单个步骤中导航执行。

源文件:

ldd --version

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

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

但是,在使用gdb进行单步调试时,行号似乎不匹配。

是否有更干净的方式下载libc6的源代码?

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

EN

回答 1

Stack Overflow用户

发布于 2022-11-26 19:53:51

Ubuntu22.04最小可运行示例

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

在glibc的情况下,调试符号似乎已经预装好了,否则我们需要通过以下方式获得它们:

代码语言:javascript
复制
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

然后获取消息来源:

代码语言:javascript
复制
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世界来测试:

main.c

代码语言:javascript
复制
#include <stdio.h>

int main(void) {
    puts("hello");
}

并将其编译成以下内容:

代码语言:javascript
复制
gcc -ggdb3 -O0 -std=c99 -Wall -Wextra -pedantic -o main.out main.c
gdb -ex 'set substitute-path . glibc-2.35'  main.out

然后将其测试为:

代码语言:javascript
复制
(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的其他一些版本在一个绝对位置上有一些源代码,如:

代码语言:javascript
复制
/tmp/build138741687/

在这种情况下,您需要:

代码语言:javascript
复制
set substitute-path /tmp/build138741687/ glibc-2.35
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48476571

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档