簡體   English   中英

靜態對象破壞時崩潰

[英]Crash at static object destruction

我正在開發第三方C ++應用程序。 在退出過程中它崩潰了。 如果看一下堆棧,我得到的只是__static_initialization_and_destruction_0函數和很多問號。 項目很大,不幸的是它有很多靜態對象。 有什么辦法找出哪一個崩潰了嗎?

雖然,這可能不是您要查找的建議,但請避免使用靜態對象。 這樣做的原因是,沒有辦法保證構造和破壞的順序。

我在這里猜測,但是一個靜態對象完全有可能依賴於另一個靜態對象。 由於無法保證銷毀順序,因此您將陷入困境。

最好將靜態對象更改為在主函數開始時創建的指針,然后在主函數結束時銷毀的指針。 然后,您可以選擇適當訂購它們。

如果可以,請運行附帶調試器的調試器,它可以讓您在崩潰時中斷。

否則,您可以嘗試在析構函數中添加日志記錄信息,例如:

std::cout << "In ~SomeObject." << std::endl;

無效的調用堆棧可能表明該堆棧已被析構函數之一破壞。 我建議您在要實例化靜態對象的每個析構函數中放置一個斷點,然后可以確定哪個是最后執行的析構函數。

同樣,在每個中斷處,您都應觀察調用堆棧以了解其已損壞的跡象。 如果將中斷放置在每個析構函數的末尾,則可能會在損壞的堆棧真正崩潰之前看到它。

如果您有多種類型的對象,則在確信該類可以正確執行后,可以刪除該類的斷點。 另外,您可能只能在僅靜態實例化的類中放置斷點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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