2016-12-28 120 views
2

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

UPDATE:

重新启动系统后,一切为了一次编译工作得很好,我可以运行新executable_file。但我在接下来的汇编中观察到同样的问题。不过,当我删除executable.o并重新编译一切看起来不错。

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

+1

您是否关闭并重新启动调试? –

+0

@Alexander O'Mara是的,但问题依然存在。 – Admia

回答

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:如果你开始它删除前,你还在运行它。(其中是旧的程序)。

+0

这次,我很幸运地从我的程序得到了正确的输出结果,告诉我Unix/Linux正在运行旧的可执行文件。如果我的程序根本没有任何输出呢?在那种情况下,我如何确保Unix正在运行新文件?当另一个程序正在使用它时,总会有机会删除一些东西。 – Admia

+1

@Admia,对不起,延迟回复。你在做什么?这是系统编程,实验,...? –

+0

这只是用C++进行科学编程。我想我通过改变我的makefile依赖关系来解决这个问题。 – Admia

2

当您删除了正在使用的文件,UNIX将删除该目录中的文件,但文件仍然会存在,直到最后一个用户用它做。

要强制gdb(或在这种情况下的任何应用程序)使用最新版本,重新启动应用程序(或重新加载文件到应用程序,如果这是一个选项)。

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

更新:如果您经常这样做,请考虑修改您的makefile以将修订版号附加到生成的可执行文件。每个可执行文件都有一个唯一的名称,这将有助于避免混淆您正在使用的文件。