gdb 重定位源文件目录

问题

在进行 gdb 调试的时候,有时候,我们会遇到使用的符号表对应的源文件目录和实际机器上的源文件目录不一致的情况。

在这个时候,在 gdb 内输入layout src命令并不能显示出对应的源文件

解决方案

我们可以通过 gdb 的set substitute-path /path/to/symbol/source/dir /path/to/actual/source/dir重定位源文件目录解决

实践方法

  1. 首先写个测试程序rcvbuf.c
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <linux/netlink.h>
#include <unistd.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
        int sockfd;
        int32_t buflen;
        size_t len = sizeof(buflen);
        int ret;

        sockfd = socket(AF_NETLINK, SOCK_RAW, NETLINK_AUDIT);
        if (sockfd < 0) {
                fprintf(stderr, "create socket fail\n");
                return -1;
        }

        ret = getsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &buflen, &len);
        if (ret < 0) {
                fprintf(stderr, "getsockopt fail\n");
        }

        printf("SO_RCVBUF is %u\n", buflen);
        printf("sizelen is %lu\n", len);
out:
        close(sockfd);
        return ret;
}
  1. 编译带符号表的可执行文件,并将源文件移动到新目录
$ gcc -g -o rcvbuf rcvbuf.c
$ mv /path/to/current/rcvbuf.c /path/to/another/rcvbuf.c
  1. gdb 调试可执行文件
$ gdb rcvbuf
(gdb) b main
(gdb) r
(gdb) layout src  // 这是看不到源文件
(gdb) set substitute-path /path/to/current /path/to/another  // 这是可以看到源文件
上一篇:Linux服务器之Socket套接字基础+简单实例(网络信息结构体、大小端转换函数、SOCKET() 、绑定 BIND()、LISTEN()、ACCEPT())


下一篇:卷一 第四章:基本TCP套接字编程