Created attachment 8065 [details] Small example to reproduce the issue with some information about my environment When trying to read one byte from _dl_debug_state (I try to read and analyse arbitrary code loaded into my memory) the behavior of my program is different depending on whether I run it with gdb or not. Memory at symbol _dl_debug_state (which is at a fixed address 0x7ffff7dea970 for my system) starts with the values 0xf3 c3. Which corresponds to a "repz ret" instruction. When i try to read the very first byte of this symbol I read 0xCC (which corresponds to a int3 instruction) instead of 0xF3. However when I inspect the memory address with gdb as following, I get the correct value 0xf3. (gdb) x/1bx 0x7ffff7dea970 0x7ffff7dea970 <_dl_debug_state>: 0xf3 But my program accidentally seems to read the trap instruction instead of the actual memory value. The attached archive contains a small example, the compiled binary and a log how to reproduce the issue. If I run the binary on its own everything is fine but if it is run within gdb I get the previously described error.
This is not a bug. GDB implements breakpoints by overwriting whatever is at the relevant addresses with int3 instructions on x86 when the inferior program is running. When the inferior stops the int3 instructions are replaced with whatever was there before. So, when your program is running you see 0xCC at that address, but when you stop it you see 0xF3.
In addition, from GDB, you'll also see 0xF3 when the program is running, as GDB hides its own breakpoints from the user.
(In reply to Gary Benson from comment #1) > This is not a bug. GDB implements breakpoints by overwriting whatever is at > the relevant addresses with int3 instructions on x86 when the inferior > program is running. When the inferior stops the int3 instructions are > replaced with whatever was there before. So, when your program is running > you see 0xCC at that address, but when you stop it you see 0xF3. > So, when your program is running > you see 0xCC at that address, but when you stop it you see 0xF3. So I can not reliably debug programs which read code which may contain breakpoints (either created by me during the debug session or created by gdb internaly)?
I don't know what you mean by reliably. What would you like GDB to do?