2014-03-18 22 views
5

Ich versuche, direkt nach dem Laden des Moduls in Gdb zu stoppen. Nehmen wir an, dass das Binary vollständig aus allen Symbolinformationen entfernt ist, also gibt es kein Main.So legen Sie den frühestmöglichen Haltepunkt fest

Ideal würde ich den Stützpunkt auf der Einstiegspunkt gesetzt, aber diese Idee setzt sich durch Verlagerungen:

(gdb) info target 
Symbols from "./application". 
Local exec file: 
    `./application', file type elf64-x86-64. 
    Entry point: 0xc154 
... 
(gdb) break *0xc154 
Breakpoint 1 at 0xc154 
(gdb) r 
Starting program: ./application 
Warning: 
Cannot insert breakpoint 1. 
Error accessing memory address 0xc154: Input/output error. 

(gdb) info target 
Symbols from "./application". 
Unix child process: 
    Using the running image of child process 22835. 
    While running this, GDB does not access memory from... 
Local exec file: 
    `./application', file type elf64-x86-64. 
    Entry point: 0x555555560154 

Auch wenn diese Art-Werke (ich einen neuen Haltepunkt auf die neue Adresse einstellen könnte und deaktivieren Sie das Original), es kann nicht einfach über Gdb-Skript/Batch-Modus ausgeführt werden, weil es eine fehlgeschlagene Anweisung in der Mitte hat.

Gibt es eine Möglichkeit, das zu tun? Idealerweise wäre etwas wie "run single instruction" statt "run" nützlich.

Antwort

8

Einstiegspunkt: 0xc154

Dies ist eine dynamisch gebundene, positionsunabhängige (PIE) binär.

Sie möchten in den dynamischen Linker stoppen, nachdem die Binärdatei geladen und verschoben wurde, aber bevor sie ausgeführt wurde.

(gdb) set stop-on-solib-events 1 
(gdb) run 
Starting program: /tmp/a.out 
Stopped due to shared library event (no libraries added or removed) 
(gdb) info target 
Symbols from "/tmp/a.out". 
Unix child process: 
     Using the running image of child process 13746. 
     While running this, GDB does not access memory from... 
Local exec file: 
     `/tmp/a.out', file type elf64-x86-64. 
     Entry point: 0x5555555545f0 
     ... 

(gdb) bt 
#0 __GI__dl_debug_state() at dl-debug.c:77 
#1 0x00007ffff7ddd488 in dl_main (phdr=<optimized out>, phnum=<optimized out>, user_entry=<optimized out>, auxv=0x7ffff7ffe870) at rtld.c:1678 
#2 0x00007ffff7defb24 in _dl_sysdep_start (start_argptr=<optimized out>, dl_main=0x7ffff7ddc6e0 <dl_main>) at ../elf/dl-sysdep.c:244 
#3 0x00007ffff7ddf365 in _dl_start_final (arg=0x7fffffffe440) at rtld.c:338 
#4 _dl_start (arg=0x7fffffffe440) at rtld.c:564 
#5 0x00007ffff7ddb6b8 in _start() from /lib64/ld-linux-x86-64.so.2 
+0

perfekt, genau das, was ich brauchte – viraptor

+0

Dies funktioniert nicht auf positionsunabhängigen ausführbaren Dateien. –

+0

@ZachRiggle Die obige Antwort enthält eine Spur von GDB-Befehlen, die * für * PIE binary gesammelt wurden, und es funktioniert eindeutig *. Wenn es für Sie nicht funktioniert hat, haben Sie vielleicht eine alte/fehlerhafte GDB oder keine GLIBC oder ... –

Verwandte Themen