簡體   English   中英

將代碼鏈接到exe時C ++程序崩潰,但是將代碼編譯到exe時工作正常,為什么呢?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM