一、问题复现
写了一个c工程,在windows开发,在linux运行,用的远程调试,在debug的过程中,发现无法debug,在idea上总是报以下错误:
Cannot insert breakpoint 8.
Cannot access memory at address 0x800157c
一开始以为是idea的问题,遂转到linux下使用gdb来调试,发现是另一个错误,执行run指令后,提示找不到 /proc/<PID>/mem
这个文件,
(gdb) run
Starting program: /tmp/tmp.MhbQxuhPlt/cmake-build-debug/tmp.MhbQxuhPlt-main
warning: opening /proc/PID/mem file for lwp 4192.4192 failed: No such file or directory (2)
Failed to read a valid object file image from memory
二、查找原因
发现问题后,马上进行各种搜素引擎查找问题以及解决方案,终于发现这是gdb的一个bug,因为我用的linux系统是windows子系统 wsl,而 WSL 中没有对 /proc/PID/mem 提供支持。
老版本的 GDB 在找不到 /proc/PID/mem 文件时,会转而使用 ptrace,而新版本的 GDB 则禁用了 ptrace,默认 /proc/PID/mem 是存在的。然而 WSL1 和 WSL2 中目前都没有这个文件;
三、解决方案
现在知道原因了,怎么解决呢?在这里有2种方案
方案1
一些动手能力强的童鞋可以自行修改gdb的二进制文件来解决问题,这个方法本人未试过,不保证可行性,使用以下链接中的方式即可解决
https://www.bilibili.com/read/cv20701507/
方案2
根据 网站 ;https://github.com/microsoft/WSL/issues/8356 的方案,在linux系统中执行以下命令即可
# gdb版本为 12.1 执行以下命令
echo -en '\x90\x90' | sudo dd of=/usr/bin/gdb count=2 bs=1 conv=notrunc seek=$((0x335C7D))
# gdb版本为 12.0.90 ,执行以下命令
echo -ne '\x90\x90' | sudo dd of=/usr/bin/gdb seek=$((0x335bad)) bs=1 count=2 conv=notrunc
不要担心会修改后会产生问题,如果有修改发现gdb无法使用了,可以通过重装gdb来解决
# 以下2个命令都可以
sudo apt-get install --reinstall gdb
sudo apt-get remove gdb -y && apt-get install gdb -y