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  // 这是可以看到源文件

gdb 重定位源文件目录

上一篇:关于ThinkPHP5.1在连接到MySQL数据库时的一些问题


下一篇:JDBC连接mariadb时使用依赖