GDB can't create a breakpoint


I am working on implementing a simple stack overflow, which I am examining with gdb. A problem I keep coming up with is gdb not accepting my breakpoints. My c code is quite simple:

void function(int a, int b, int c) {

void main() {
  int x;

  x = 0;
  x = 1;

And i'm using gcc -m32 -fno-stack-protector -o example3test example3test.c to complie it.

I have tried just setting a simple breakpoint on the line <+42> just to test if it works.

(gdb) disass main
Dump of assembler code for function main:
   0x000005d1 <+0>:     lea    0x4(%esp),%ecx
   0x000005d5 <+4>:     and    $0xfffffff0,%esp
   0x000005d8 <+7>:     pushl  -0x4(%ecx)
   0x000005db <+10>:    push   %ebp
   0x000005dc <+11>:    mov    %esp,%ebp
   0x000005de <+13>:    push   %ebx
   0x000005df <+14>:    push   %ecx
   0x000005e0 <+15>:    sub    $0x10,%esp
   0x000005e3 <+18>:    call   0x470 <__x86.get_pc_thunk.bx>
   0x000005e8 <+23>:    add    $0x1a18,%ebx
   0x000005ee <+29>:    movl   $0x0,-0xc(%ebp)
   0x000005f5 <+36>:    push   $0x3
   0x000005f7 <+38>:    push   $0x2
   0x000005f9 <+40>:    push   $0x1
   0x000005fb <+42>:    call   0x5a0 <function>
   0x00000600 <+47>:    add    $0xc,%esp
   0x00000603 <+50>:    movl   $0x1,-0xc(%ebp)
   0x0000060a <+57>:    sub    $0x8,%esp
   0x0000060d <+60>:    pushl  -0xc(%ebp)
   0x00000610 <+63>:    lea    -0x1950(%ebx),%eax
   0x00000616 <+69>:    push   %eax
   0x00000617 <+70>:    call   0x400 <printf@plt>
   0x0000061c <+75>:    add    $0x10,%esp
   0x0000061f <+78>:    nop
   0x00000620 <+79>:    lea    -0x8(%ebp),%esp
   0x00000623 <+82>:    pop    %ecx
   0x00000624 <+83>:    pop    %ebx
   0x00000625 <+84>:    pop    %ebp
   0x00000626 <+85>:    lea    -0x4(%ecx),%esp
   0x00000629 <+88>:    ret
End of assembler dump.
(gdb) break *0x000005fb
Breakpoint 1 at 0x5fb
(gdb) run
Starting program: /home/jasmine/tutorials/smashingTheStackForFun/example3test
Cannot insert breakpoint 1.
Cannot access memory at address 0x5fb

I'm lost as to why it won't accept this breakpoint. Most of the answers already on here involve not using the * or using wrong notation, from what I can see mine looks right, but I could be wrong.

asked on Stack Overflow Oct 24, 2018 by Johan14th

1 Answer


I'm lost as to why it won't accept this breakpoint.

You have a position independent executable, which is relocated to a different address at runtime.

This will work:

(gdb) start
# GDB stops at main

(gdb) break *&main+42
(gdb) continue

See also this answer.

answered on Stack Overflow Oct 24, 2018 by Employed Russian

User contributions licensed under CC BY-SA 3.0