2017-03-24 96 views
0

我有下面的C代碼:GDB步過命令

#include <inc/x86.h> 
#include <inc/elf.h> 

#define SECTSIZE 512 
#define ELFHDR ((struct Elf *)0x10000) // scratch space 

void readsect(void*, unit32_t); 
void readsec(uint32_t, uint32_t, uint32_t); 

void bootmain(void) 
{ 
    struct Proghdr *ph, *eph; 

    // read 1st page off disk 
    readseg((uint32_t) ELFHDR, SECTSIZE*8, 0); 
    . 
    . // REST OF CODE 
    . 
} 

我使用gdb的步驟在我的代碼,看看發生了什麼。
我找到了bootmain 0x7d0a的地址,我在那裏放了一個斷點。

b *0x7d0a 
c 

上述2個命令:b放折斷點和c運行直至達到突破點。

我可以看到,我按預期在0x7d0a停住了。 然後,在幾個命令後,我可以看到被推入堆棧的函數參數作爲參數。並致電readseg

0x7d0f push $0x0  // 0 
0x7d11 push $0x1000 // 512*8 = 4096 B 
0x7d16 push $0x10000 // 64 KB 
0x7d1b call 0x7cd1 

我的問題是:如何跨越此功能?下一個命令使用si只是讓我進入readseg函數。我不想介入,而是跨過一步。我試圖把一個破發點,接下來的下一個命令:

b *0x7d21 
c 

但它永遠不會返回......

也許我應該設置在不同的地址斷點?不確定。然而,這是一種解決方法,我寧願使用在文檔here中找不到的step over命令。

+0

爲什麼在設置斷點時使用十六進制地址而不是語句行號? – Barmar

+0

@Barmar我不明白你的意思?因爲我需要我的代碼中特定指令的地址。 –

+0

@TonyTannous你可以說'斷開bootmain到GDB,它比'break * 0x7d0a'更容易。 – unwind

回答

0

si的「step over」類似物被稱爲nexti(也簡寫爲ni)。這將會執行單個彙編指令,但會逐步調用。

+0

沒有工作。 'call 0x7cd1'後的'nexti'沒有顯示下一個命令'0x7d61'。但是顯示下一個命令地址爲:'0x7cd1',這意味着它進入。:/ –

+0

平原'n'如何?這就是我用於'下一行'的原因。並且'進入'。 – gilez

+0

如果'ni'不工作,並且下面的指令中的'break'沒有被觸發,那麼問題可能是電話沒有返回。 –