我有下面的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命令。
爲什麼在設置斷點時使用十六進制地址而不是語句行號? – Barmar
@Barmar我不明白你的意思?因爲我需要我的代碼中特定指令的地址。 –
@TonyTannous你可以說'斷開bootmain到GDB,它比'break * 0x7d0a'更容易。 – unwind