2016-12-28 85 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以將修訂版號附加到生成的可執行文件。每個可執行文件都有一個唯一的名稱,這將有助於避免混淆您正在使用的文件。