Compilation GDB正在运行一个已删除的可执行文件 我调试了C++代码生成的执行文件>代码>。当我处于GDB会话的中间时,我改变了源代码> CPP文件并重新编译它们以重新生成一个新的代码> ExtUpable文件。现在,GDB正在运行旧的已删除的可执行文件,即使我已经从系统中删除了该旧文件。这怎么可能?如何强制GDB运行新的可执行文件

Compilation GDB正在运行一个已删除的可执行文件 我调试了C++代码生成的执行文件>代码>。当我处于GDB会话的中间时,我改变了源代码> CPP文件并重新编译它们以重新生成一个新的代码> ExtUpable文件。现在,GDB正在运行旧的已删除的可执行文件,即使我已经从系统中删除了该旧文件。这怎么可能?如何强制GDB运行新的可执行文件,compilation,gdb,Compilation,Gdb,更新: 重新启动系统后,第一次编译时一切正常,我可以运行新的可执行文件。但我在下一次汇编中也观察到了同样的问题。然而,当我删除executable.o并重新编译时,一切看起来都很好 这是因为我的makefile中存在问题吗?或者我破坏了Unix系统中的某些东西?一旦程序、库等加载到内存中,它可以被删除,但仍然可以运行。一旦程序关闭并重新启动,您将运行新程序 出现问题的一个例子是,我多次删除了Linux box运行所需的库或可执行文件。一旦我重新启动电脑,我很快意识到我把它弄糟了 快乐时光 举例

更新:

重新启动系统后,第一次编译时一切正常,我可以运行新的
可执行文件
。但我在下一次汇编中也观察到了同样的问题。然而,当我删除
executable.o
并重新编译时,一切看起来都很好


这是因为我的makefile中存在问题吗?或者我破坏了Unix系统中的某些东西?

一旦程序、库等加载到内存中,它可以被删除,但仍然可以运行。一旦程序关闭并重新启动,您将运行新程序

出现问题的一个例子是,我多次删除了Linux box运行所需的库或可执行文件。一旦我重新启动电脑,我很快意识到我把它弄糟了

快乐时光


举例来说,

/*
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;
    }
/*
编译我。
运行可执行文件。
程序运行时,删除可执行文件/二进制文件。
程序将继续打印消息。
*/
#包括
#包括
int main(){
而(1){
printf(“我还在运行。\n”);
睡眠(2);
}
返回0;
}

要回答您的问题,请关闭当前正在运行的
gdb
会话。然后使用新的可执行文件启动一个新的



PS:如果您在删除它之前启动了它,那么您仍然在运行它。(如果是旧程序。)

当您删除正在使用的文件时,Unix将从目录中删除该文件,但该文件仍将存在,直到最后一个用户使用完它

要强制gdb(或在这种情况下的任何应用程序)使用最新版本,请重新启动应用程序(或将文件重新加载到应用程序中,如果可以的话)

作为比较,如果您在Windows上运行,则在文件已在使用时重新生成可执行文件时会出现错误


<强> Update:如果您经常这样做,请考虑修改MaCH文件,将修订号追加到生成的可执行文件中。每个可执行文件都有一个唯一的名称,这将有助于避免混淆您正在使用的文件。

是否关闭并重新启动调试?@Alexander O'Mara是的,但问题仍然存在。这一次,我很幸运地从程序中获得了正确的输出,显示Unix/Linux正在运行旧的可执行文件。如果我的程序没有任何输出怎么办?在这种情况下,如何确保Unix正在运行新文件?当另一个程序正在使用某个内容时,我总是有可能删除该内容。@Admia,很抱歉延迟响应。你在干什么?这是系统编程、实验等吗?它只是C++的科学编程。我想我通过更改makefile依赖项解决了这个问题。@A:太好了!我很高兴你(希望)解决了你的问题。致以最良好的祝愿