1. ホーム
  2. Qt

アセンブリエラーです。Warning: Warning: ブレークポイント 1 を挿入できません。Cannot access memory at address 0x1135 解決策(ブレークポイントを挿入せずに1回目の実行を行う)

2022-02-25 23:12:51
<パス

linuxでgdbによる中断点デバッグを行ったところ、以下のようなエラーが発生しました。

(gdb) run
Starting program: /home/dontla/desktop/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? 
dontla@dontla-virtual-machine:~/desktop/test$ c


そして、gdbでプログラムを開き、デバッグのために中断する前に実行します。

dontla@dontla-virtual-machine:~/desktop/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/desktop/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
   0x000055555555555135 <+5>: mov $0x2,%ebx
   0x00005555555555513a <+10>: add %ebx,%eax
   0x00005555555555513c <+12>: retq   
   0x00005555555555513d <+13>: nopl (%rax)
End of assembler dump.
(gdb) break *0x000055555555555135
Breakpoint 1 at 0x55555555555135
(gdb) run
Starting program: /home/dontla/desktop/test/test 

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



というのもあります。

データブレークポイントの設定が間違っていることが原因です。disasemble命令でディスアセンブルされたアセンブリ言語の左側のアドレスオフセットアドレスは、実行ファイルをgdbで実行するまで論理的なアドレスではありません。そのため、break命令でブレークポイントを設定できても、gdbの実行時にはこのアドレスにアクセスすることは不可能です。そこで、上記のようなエラーが発生するのです。
データブレークポイント:メモリアドレスにブレークポイントを設定し、そのアドレスの内容を変更するとブレークポイントが発生し、そのアドレスに実行するとブレークポイントが発生します。(参考までにWebより)

プログラムは物理アドレスではなく論理アドレスを与え、物理アドレスはシステムによって論理アドレスにマッピングされるということを最初に知っておく必要があります。

参考記事 GDB data data break(メモリブレークポイント)エラー。Warning: ブレークポイントを挿入できません