[英]C++ program crashes when code is linked to exe but works fine when code is compiled into exe, how come?
我有一個可以在一個平台上長期運行的程序。 由於其成功,它將被移植到另一個平台。 沒問題,我以為是因為它是用標准C ++編寫的...
我的方法(用偽CMake進行說明):
將所有核心業務邏輯分解到一個應用程序對象中,並從該對象中構建一個庫(來自相同源代碼的每個平台的一個庫):
add_library(appLib STATIC app.cpp) target_link_libraries(appLib utilLib networkLib dbLib ${boostLibs})
有一個main_a.cpp和另一個main_b.cpp,分別對平台a和b進行特定於平台的初始化,然后讓main函數實例化應用程序對象。
int main() { auto result = initAndDoPlatformStuff(); App app(result); app.run(); }
指示編譯器和鏈接器匯編可執行文件:
if (Platform_A) add_executable(appExe main_a.cpp) else() add_executable(appExe main_b.cpp) endif() target_link_libraries(appExe appLib)
原則上,我猜這是一種完全有效的方法。 但實際上,它是行不通的。 在第二個程序崩潰后,崩潰幾乎每次都不同。 檢查核心轉儲時,它有時會在標准庫中崩潰,有時會在boost庫中以及我的代碼中崩潰,但這是胡說八道。 程序似乎可以工作10次,但最終會崩潰。
但是,如果我使用完全相同的代碼,則僅將其提取到其原始main.cpp文件中,然后以不同的方式將其構建在一起,如下所示:
int main()
{
auto result = initAndDoStuff();
processForever(result); // Business logic
}
add_executable(appExe main.cpp)
target_link_libraries(appExe utilLib networkLib dbLib ${boostLibs})
那就行了!
我感到困惑和困惑。 我懷疑它必須與代碼布局有關,因此我嘗試了PIC和PIE的不同變體,但沒有成功。 有沒有可用的工具可讓您全面了解二進制代碼的布局? 我知道nm,od,objdump,但是它們是低級的,我不知道要尋找什么...也許我無論如何都走錯了路,也許問題與某些完全不同的問題有關。 是否有人會引起這種行為的任何預感? 我還能如何解決這個問題?
實際上,故障是我的。 當然...當我將代碼重構為lib時,我確實盡力使所有細節正確無誤,但顯然我不夠謹慎,在尋找問題時視而不見。
我最終發現的問題是,重構后我仍然將一個變量保留為局部變量,然后超出了范圍,導致引用了已釋放的內存,這導致了各種不確定的行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.