2012-04-02 10 views
32

Czy mamy sposób, aby wyświetlić kod assemblera i c zarówno przy użyciu gdb.Zobacz zarówno Assembly and C code

disassemble nazwa_funkcji pokazuje tylko zespół, próbowałem znaleźć sposób łatwego mapowania kodu c do montażu. Dzięki

Odpowiedz

40

można uruchomić gdb w tekst interfejsu użytkownika tryb (TUI):

gdb -tui <your-binary> 
(gdb) b main 
(gdb) r 
(gdb) layout split 

Komenda layout split dzieli okno na dwie części - jedna z nich wyświetlanie kodu źródłowego, drugi z odpowiedni montaż. kilka innych sztuczek:

  • zestaw demontaż-smak intel - jeśli wolą notacji Intel
  • zestaw drukowania ASM-demangle - demangles C nazwy ++ w widoku zespołu
  • ni - Next instrukcja
  • si - instrukcja krokowa

Jeśli nie chcesz używać trybu TUI (np. terminal nie podoba), zawsze można zrobić:

x /12i $pc 

co oznacza drukowania 12 instrukcji z programu aktualny adres licznika - to również działa z powyższych sztuczki (demangling, wchodząc instrukcje, itp).

Sztuczka "x/12i $ pc" działa zarówno w gdb, jak i cgdb, natomiast "podział układu" działa tylko w gdb.

Enjoy :)

+0

Czy istnieje jakiś sposób, aby również pozbyć górnym oknie podzielonym? To niepotrzebne i zajmuje miejsce. –

+2

@BabkenVardanyan Spróbuj 'layout next'. Jeśli nie daje pożądanego układu, wypróbuj to polecenie jeszcze kilka razy. To polecenie przełącza między układami, dzięki czemu możesz zachować to, co chcesz. –

17

Spróbuj disassemble /m.

Patrz http://sourceware.org/gdb/current/onlinedocs/gdb/Machine-Code.html#Machine-Code

format jest podobny do tego z objdump -S i intermixes źródło z demontażu. Przykładowe wyjście fragment:

10  int i = 0; 
=> 0x0000000000400536 <+9>: movl $0x0,-0x14(%rbp) 

11  while (1) { 
12   i++; 
    0x000000000040053d <+16>: addl $0x1,-0x14(%rbp) 
+0

Nie chciałem innych rozwiązań, ponieważ nie chcę ponownie uruchamiać gdb i ustawić go ponownie w ten sam sposób, a odwołania do plików .o do przeniesionych sekcji utrudniają zrozumienie. Więc pomyślałem, że to tylko bilet.Jakież było moje przerażenie, a potem, kiedy w końcu zrozumiał, że demontażu/m dyskretnie pomija kilka wskazówek, jak po pierwszym, instrukcja trzech bajtów: '0x000000000442f038 <+24>: \t mov% RSI,% rbx 0x000000000442f043 <+35>: \t sub $ 0x38, % rsp' To jest 'GNU gdb (GDB) 7.4.1-debian'. –

3

Dla celów, spróbuj

objdump -S <your_object_file> 

od człowieka objdump:

-S 
--source 
Display source code intermixed with disassembly, if possible. 
Implies -d.