(Centos 7)GDB 调试 glibc(附视频)

2021-11-09

glibc 这个 c 库,封装了很多代码,可以通过 gdb 调试进去深入理解底层源码。


1. glibc 库作用

glibc 很多时候作为应用程序与内核之间交互的过渡角色,处理了很多源码工作细节。

图片来源:《Linux 内核设计与实现》- 第五章 - 系统调用


2. gdb 调试效果


3. 插件安装

  • 系统
1
2
# uname -r
3.10.0-957.21.3.el7.x86_64
  • 配置 yum 安装调试插件仓库路径。
1
2
3
4
5
6
7
8
9
10
11
12
# 设置镜像路径。
vim /etc/yum.repos.d/CentOS-Debuginfo.repo

# 填充下面内容。
#------------------------------
[base-debuginfo]
name=Centos-7 - Debuginfo
baseurl=http://debuginfo.centos.org/7/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-Debug-7
enable=1
#------------------------------
  • 安装相应的调试插件。debuginfo-install 应该安装哪个版本的调试信息,如果不清楚,可以写测试代码通过 gdb 调试,缺少的插件,gdb 会提示,安装即可。
1
2
3
yum install nss-softokn-debuginfo –nogpgcheck
yum install yum-utils gdb gcc-c++
debuginfo-install glibc-2.17-260.el7_6.6.x86_64 libgcc-4.8.5-44.el7.x86_64 libstdc++-4.8.5-44.el7.x86_64

4. 测试源码

1
2
3
4
5
6
7
8
9
10
11
12
/* gcc -g -O0 test.c -o test */
#include <stdio.h>
#include <string.h>

int main(int argc, char** argv) {
    char test[2];
    const char* p = "hello world";

    printf("%s", "snprintf: ");
    snprintf(test, sizeof(test), "%s", p);
    printf("%s\n", test);
}

5. 调试视频

视频连接:(Centos) Debugging in glibc with gdb


6. 后记

急着调试确认一个知识点,手上的云主机以前是可以调试 libc 库的,后面因为装了不少版本的 gdb,不知为啥,现在调试死活跳不进 libc 的代码了,虚拟机跑个遍也没折腾好 😭。

最后花了 22 块钱买了个一星期时限的最低配的阿里云共享型主机重新测试,一下就搞掂了,相比重新安装一个虚拟机倒腾的时间成本划算多了。——付费思维现在感觉开始慢慢转变。