c - GDB单步执行命令

标签 c operating-system gdb bootloader att

我有以下 C 代码:

#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 the first page off disk
    readseg((uint32_t) ELFHDR, SECTSIZE*8, 0);
    .
    .  // The rest of the code
    .
}

我正在使用 GDB 来单步执行我的代码,看看发生了什么。

我找到了 bootmain 0x7d0a 的地址,并在那里放置了一个断点。

b *0x7d0a
c

上面两个命令: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命令。 .

最佳答案

si 的“跨步”类似物称为 nexti(也缩写为 ni)。这将单步执行单个汇编指令,但单步执行调用。

关于c - GDB单步执行命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43004019/

相关文章:

C链表删除最小元素

c - 如何从 C 中的目录中检索文件名和子目录名?

c++ - 如何将 uint8_t(SDL 中的 Uint8)转换为字符串?

c++ - 添加断点并运行程序时无法访问地址处的内存

c++ - 尽可能快地渲染立方体? (OpenGL)

caching - 高速缓存未命中,TLB未命中和页面错误

c - Linux Kernel 4.2.x:为什么选中时预期的系统调用地址与实际地址不匹配?

c - 使用 dup2() 系统调用管道超过 3 个程序?

c - 为什么使用GDB检查时,某些局部变量没有列在相应的堆栈帧中?

GDB从核心文件获取可执行路径