GDB正在运行已删除的可执行文件

时间:2016-12-28 04:04:56

标签: compilation gdb

我正在调试一个从C ++代码生成的executable_file。当我在GDB会话中时,我更改了source.cpp文件并重新编译它们以重新生成新的executable_file。现在,GDB正在运行旧的已删除executable_file,即使我已从系统中删除了旧文件。这怎么可能?如何强制GDB运行新的executable_file

更新

重新启动系统后,第一次编译的一切正常,我可以运行新的executable_file。但我正在为下一次编辑观察同样的问题。然而,当我删除executable.o并重新编译一切看起来很好。

这是因为我的makefile中存在问题吗?或者我在Unix系统中破坏了什么?

2 个答案:

答案 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: 如果您在删除它之前启动了它,那么您仍然在运行它。(其中是旧的程序。)