解决ubuntu linux debug时报错: Cannot insert breakpoint xxx. Cannot access memory at address xxx

发布时间:2023-11-07 18:22:43 作者:yexindonglai@163.com 阅读(587)

一、问题复现

写了一个c工程,在windows开发,在linux运行,用的远程调试,在debug的过程中,发现无法debug,在idea上总是报以下错误:

  1. Cannot insert breakpoint 8.
  2. Cannot access memory at address 0x800157c

一开始以为是idea的问题,遂转到linux下使用gdb来调试,发现是另一个错误,执行run指令后,提示找不到 /proc/<PID>/mem 这个文件,

  1. (gdb) run
  2. Starting program: /tmp/tmp.MhbQxuhPlt/cmake-build-debug/tmp.MhbQxuhPlt-main
  3. warning: opening /proc/PID/mem file for lwp 4192.4192 failed: No such file or directory (2)
  4. 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系统中执行以下命令即可

  1. # gdb版本为 12.1 执行以下命令
  2. echo -en '\x90\x90' | sudo dd of=/usr/bin/gdb count=2 bs=1 conv=notrunc seek=$((0x335C7D))
  3. # gdb版本为 12.0.90 ,执行以下命令
  4. echo -ne '\x90\x90' | sudo dd of=/usr/bin/gdb seek=$((0x335bad)) bs=1 count=2 conv=notrunc

不要担心会修改后会产生问题,如果有修改发现gdb无法使用了,可以通过重装gdb来解决

  1. # 以下2个命令都可以
  2. sudo apt-get install --reinstall gdb
  3. sudo apt-get remove gdb -y && apt-get install gdb -y

关键字linux