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