我可以使用 gdb 编辑代码行吗?是否也可以在同一个调试会话中保存到实际的源文件和头文件? linux
can I edit lines of code using gdb and is it also possible to save to actual source file and header file while in same debug session? linux
我有一个名为 parser
的程序,我用 -g
标记编译,这是我的 makefile
parser: header.h parser.c
gcc -g header.h parser.c -o parser
clean:
rm -f parser a.out
parser.c
中一个函数的代码是
int _find(char *html , struct html_tag **obj)
{
char temp[strlen("<end")+1];
memcpy(temp,"<end",strlen("<end")+1);
...
...
.
return 0;
}
我在调试解析器或其他东西时喜欢看到的是,我还可以在遇到断点后和 n
通过上述函数的代码时更改代码行。如果它不是 gdb
的工作,那么是否有任何开源解决方案来实际更改代码和可能的保存,所以当我 运行 通过代码中的下一个语句然后在执行 n (possible different index of array)
之前更改语句将执行,有没有开源工具或者可以在gdb中完成我需要做一些编译选项吗?
我知道我可以在 运行 时间在 gdb 中为变量赋值,但这是吗?好像有什么东西可以改变 soure
大多数 C 实现都是编译的。源代码被分析并翻译成处理器指令。这种翻译很难分段进行。也就是说,给定源代码中的一些小更改,实际上不可能更新可执行文件来表示这些更改。作为翻译的一部分,编译器转换和交织语句,分配处理器寄存器用于计算部分表达式,指定内存中的位置来保存数据,等等。当源代码发生轻微变化时,这可能会导致新的编译发生在一个地方使用不同的寄存器,或者在特定函数中需要更多或更少的内存,从而导致数据来回移动。将这些更改合并到 运行 程序中需要找出所有差异、移动内存中的内容、重新排列处理器寄存器中的内容,等等。出于实际目的,这些更改是不可能的。
GDB 不支持这个。
(Apple 的开发者工具可能有这样的功能。我看到它针对 Swift 编程语言进行了演示,但没有使用它。)
我有一个名为 parser
的程序,我用 -g
标记编译,这是我的 makefile
parser: header.h parser.c
gcc -g header.h parser.c -o parser
clean:
rm -f parser a.out
parser.c
中一个函数的代码是
int _find(char *html , struct html_tag **obj)
{
char temp[strlen("<end")+1];
memcpy(temp,"<end",strlen("<end")+1);
...
...
.
return 0;
}
我在调试解析器或其他东西时喜欢看到的是,我还可以在遇到断点后和 n
通过上述函数的代码时更改代码行。如果它不是 gdb
的工作,那么是否有任何开源解决方案来实际更改代码和可能的保存,所以当我 运行 通过代码中的下一个语句然后在执行 n (possible different index of array)
之前更改语句将执行,有没有开源工具或者可以在gdb中完成我需要做一些编译选项吗?
我知道我可以在 运行 时间在 gdb 中为变量赋值,但这是吗?好像有什么东西可以改变 soure
大多数 C 实现都是编译的。源代码被分析并翻译成处理器指令。这种翻译很难分段进行。也就是说,给定源代码中的一些小更改,实际上不可能更新可执行文件来表示这些更改。作为翻译的一部分,编译器转换和交织语句,分配处理器寄存器用于计算部分表达式,指定内存中的位置来保存数据,等等。当源代码发生轻微变化时,这可能会导致新的编译发生在一个地方使用不同的寄存器,或者在特定函数中需要更多或更少的内存,从而导致数据来回移动。将这些更改合并到 运行 程序中需要找出所有差异、移动内存中的内容、重新排列处理器寄存器中的内容,等等。出于实际目的,这些更改是不可能的。
GDB 不支持这个。
(Apple 的开发者工具可能有这样的功能。我看到它针对 Swift 编程语言进行了演示,但没有使用它。)