汇编报错:Warning: Cannot insert breakpoint 1. Cannot access memory at address 0x1135 解决办法(先不打断点run一遍)

6 篇文章 0 订阅
431 篇文章 28 订阅

在linux下用gdb打断点调试发现报错了:

(gdb) run
Starting program: /home/dontla/桌面/test/test 
Warning:
Cannot insert breakpoint 1.
Cannot access memory at address 0x1135

解决办法:

先退出GDB

(gdb) quit
A debugging session is active.

	Inferior 1 [process 32756] will be killed.

Quit anyway? (y or n) 
dontla@dontla-virtual-machine:~/桌面/test$ c

然后用gdb打开程序先run一遍再打断点调试:

dontla@dontla-virtual-machine:~/桌面/test$ gdb ./test
GNU gdb (Ubuntu 9.2-0ubuntu1~20.04) 9.2
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ./test...
(No debugging symbols found in ./test)
(gdb) run
Starting program: /home/dontla/桌面/test/test 
[Inferior 1 (process 32770) exited with code 03]
(gdb) disas main
Dump of assembler code for function main:
   0x0000555555555130 <+0>:	mov    $0x1,%eax
   0x0000555555555135 <+5>:	mov    $0x2,%ebx
   0x000055555555513a <+10>:	add    %ebx,%eax
   0x000055555555513c <+12>:	retq   
   0x000055555555513d <+13>:	nopl   (%rax)
End of assembler dump.
(gdb) break *0x0000555555555135
Breakpoint 1 at 0x555555555135
(gdb) run
Starting program: /home/dontla/桌面/test/test 

Breakpoint 1, 0x0000555555555135 in main ()
(gdb) 

这是因为:

原因在于数据断点的设置有误。在没有用gdb运行(run)过可执行程序之前,使用disasemble指令反汇编出来的汇编语言的左边的地址偏移地址,不是逻辑地址。所以,即使break指令能够设置断点,当GDB运行时也不可能访问到这个地址。也就会出现上面的错误。
数据断点:给某个内存地址设置断点,改变该地址所装内容时会触发断点,运行到该地址时会触发断点。(从网上看的,参考)
而学过操作系统或者微机原理就该知道,程序给出来的只是逻辑地址,不可能直接给物理地址的,物理地址都是由系统将其映射成了逻辑地址。

参考文章:GDB数据数据断(内存断点)报错:Warning: Cannot insert breakpoint

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: 此为在调试器的评估过程中发生的跳过断点错误,位于java.lang.class.forname0(java.lang.string, boolean, java.lang.classloader, java.lang.class)函数内。 ### 回答2: 首先,我们需要了解断点的概念。在使用调试器时,我们可以在程序中设置断点,以便在程序执行到该断点时暂停程序的执行,这可以使我们更容易地检查程序的状态和行为。 然而,在使用调试器时,有一种情况会出现“跳过断点”的情况,即当调试器遇到一个断点时,并不会暂停程序的执行。这种情况下,我们可以看到一个类似于这样的错误信息:“skipped breakpoint at java.lang.class.forname0(java.lang.string, boolean, java.lang.classloader, java.lang.class) -1 because it happened inside debugger evaluation”。 这种情况的出现可能是由于我们在使用调试器时进行了一些调试器自己的计算或操作,而这些计算或操作可能会触发某些断点。此时,调试器会跳过这些断点,以使程序继续执行下去,而不会暂停程序的执行。 为了解决这个问题,我们可以尝试以下一些措施: 第一,我们可以尝试将调试器的结果计算放在别的地方,而不是直接在断点位置进行计算。这样可以避免调试器的计算触发了断点。 第二,我们可以尝试将断点设置在计算完成后的语句上。这样可以避免在断点位置进行计算,从而规避掉了问题。 总之,跳过断点的情况是一种常见的问题,在使用调试器时需要进行一定的防范。注意调试器的计算和操作,以避免出现这种情况。 ### 回答3: 这个错误信息是Java语言中常见的调试错误之一。通常来说,当我们在调试代码的时候,会在某个地方设置一个断点,程序在运行到这个断点时会暂停,然后我们可以通过查看变量、执行下一条语句等操作来进行调试。 但有时候,在代码执行到这个断点的时候,会出现一些问题,暂停的断点没有被触发,同时控制台会输出“skipped breakpoint”的警告。这可能会导致我们难以调试代码,影响我们的工作效率。 其中,这个具体的警告信息“skipped breakpoint at java.lang.class.forname0(java.lang.string, boolean, java.lang.classloader, java.lang.class) -1 because it happened inside debugger evaluation”表示程序在执行这条语句时,已经进入了Dubugger执行状态,从而跳过了这个断点。而“java.lang.class.forname0”则是Java语言中负责加载类的函数,这个函数有些特殊,不能正常地进行断点调试。 如何解决这个问题呢?有两种方法可以尝试一下: 一是去掉或者移动这个断点。可以尝试在其他地方添加断点,或者暂时去掉这个断点,直到成功调试代码为止。 二是使用其他工具进行调试。可以使用一些其他的调试工具,比如Eclipse、IntelliJ IDEA等,这些工具对Java调试的支持更加完善,可以避免一些调试错误。 总之,对于Java代码调试过程中出现“skipped breakpoint”这个问题,需要我们耐心地排查,采取适当的措施,从而能够成功地调试代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dontla

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值