调试时 step into 和 step over 有什么区别?

逆向工程 艾达 拆卸 调试器 数据库 调试
2021-06-25 06:50:08

我正在使用 EDB 并逐步执行该程序,但我什至不知道这样做时的行为有何不同。如果我有希望对这个程序进行逆向工程,我觉得这是我应该知道的。

1个回答

gdb术语(和命令)是stepnext和所不同的是step继续运行,直到它改变的源代码行,而next不会追踪到一个子程序,而是跳过它。stepinexti命令是类似的,但在机器指令级,而不是源代码级进行操作。精细手册中阅读更多内容

这是一个可能有助于澄清的示例。假设您有一个包含三个简单文件的简单项目:

主文件

#include "squareit.h"
#include <stdio.h>

int main(void) {
    int x = 5;
    printf("%d squared is %d\n", x, squareit(x));
}

方格文件

#ifndef SQUAREIT_H
#define SQUAREIT_H
// return the square of an integer
int squareit(int x);
#endif // SQUAREIT_H

squareit.c

#include "squareit.h"

int squareit(int x) {
    return x*x;
}

我们在启用调试标志的情况下编译程序 ( gcc -g main.c squareit.c -o simple),然后运行gdb simple. 如果我们坐在printf线上执行step,我们会发现自己在squareit()函数中。相反,如果我们在同一点执行next,则squareit()函数和printf()函数都将执行,我们将发现自己位于main().

会议如下:

(gdb) b main
Breakpoint 1 at 0x40113d: file ./main.c, line 5.
(gdb) run
Starting program: ./simple 

Breakpoint 1, main () at ./main.c:5
5       int x = 5;
(gdb) step
6       printf("%d squared is %d\n", x, squareit(x));
(gdb) s
squareit (x=5) at ./squareit.c:4
4       return x*x;
(gdb) s
5   }
(gdb) s
5 squared is 25
main () at ./main.c:7
7   }
(gdb) r
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: ./simple 

Breakpoint 1, main () at ./main.c:5
5       int x = 5;
(gdb) s
6       printf("%d squared is %d\n", x, squareit(x));
(gdb) next
5 squared is 25
7   }

gdb这里使用命令是b设置一个断点,s它的别名为stepnext(别名为n)和run(别名为r)。