我正在调试一个从C ++代码生成的executable_file
。当我在GDB会话中时,我更改了source.cpp
文件并重新编译它们以重新生成新的executable_file
。现在,GDB正在运行旧的已删除executable_file
,即使我已从系统中删除了旧文件。这怎么可能?如何强制GDB运行新的executable_file
?
更新
重新启动系统后,第一次编译的一切正常,我可以运行新的executable_file
。但我正在为下一次编辑观察同样的问题。然而,当我删除executable.o
并重新编译一切看起来很好。
这是因为我的makefile中存在问题吗?或者我在Unix系统中破坏了什么?
答案 0 :(得分:2)
当您删除正在使用的文件时,Unix将从目录中删除该文件,但该文件将一直存在,直到最后一个用户完成该文件。
要强制gdb(或在这种情况下的任何应用程序)使用最新版本,请重新启动应用程序(或者如果可以选择将文件重新加载到应用程序中)。
作为比较点,如果您在Windows上运行,则在文件已被使用时重新生成可执行文件时会出错。
更新:如果您经常这样做,请考虑修改您的makefile以将修订号附加到生成的可执行文件中。每个可执行文件都有一个唯一的名称,这有助于避免混淆您正在使用的文件。
答案 1 :(得分:1)
将程序,库等加载到内存后,可以将其删除但仍可以运行。程序关闭并重新启动后,您将运行新程序。
这是一个有问题的实例是我删除了我的Linux机箱需要运行的库或可执行文件的次数。一旦我重新启动计算机,我很快意识到我搞砸了......
欢乐时光。
举例来说,
/*
Compile me.
Run the executable.
While the program is running, delete the executable/binary.
The program will continue printing the message.
*/
#include <stdio.h>
#include <unistd.h>
int main () {
while (1) {
printf("I'm still running.\n");
sleep(2);
}
return 0;
}
要回答您的问题,关闭当前正在运行的gdb
会话。然后使用新的可执行文件启动一个新的。
PS: 如果您在删除它之前启动了它,那么您仍然在运行它。(其中它是旧的程序。)