2011-04-14 63 views
4

我在Linux服務器上運行C/C++程序來爲視頻提供服務。該程序(稱爲插件)的核心功能是轉換視頻,併爲每個視頻請求分開一個單獨的插件進程。但我有一個奇怪的問題,有時服務器負載平均值意外高。我在這個階段從頂層的命令看到的是,有一些進程運行很長時間並且需要一些巨大的CPU。C/C++程序中的損壞堆棧問題

當調試使用gdb和回溯堆棧這個正在運行的程序,我發現了什麼是腐敗棧:「上一幀內該幀(堆棧損壞?)」。我搜查了網絡,發現如果程序出現分段錯誤,就會發生這種情況。

但我知道,如果該計劃得到段錯誤,程序應該崩潰,在這一點上退出。但令人驚訝的是,程序在分段錯誤後仍然運行。

這可能是什麼原因造成的?我知道一定有在節目中的一些大問題,但我只是不明白從哪裏開始解決這個問題......這將是巨大的,如果任何你能告訴我一些燈光......

謝謝推進

+1

在您的案例中可能存在腐敗卡住意味着您使用了一個不應該使用的內存位置。當這樣的事情發生時,結果是未定義的行爲。該程序不會註定要崩潰。什麼都可能發生。 – Muggen 2011-04-14 18:59:45

回答

2

附加調試程序會更改過程的行爲,所以您很可能無法獲得可靠的調查結果。來自調試器的損壞的堆棧消息可能意味着特定的調試器不理解來自二進制文件的文本信息。

我會建議運行的pstack若干時間之後的問題(這被稱爲「蒙地卡羅性能分析」),並還附上strace的桁架的問題,並檢查哪些系統調用是進程在使用CPU時進行操作。

1

Valgrind下運行程序和修復任何無效的內存寫入它找到。

+0

嗨,山姆,你可以請給出一些信息,爲什麼程序仍然會運行,如果它分段故障?謝謝 – 2011-04-14 18:50:26

+1

@mahmudul可能你遇到了未定義的行爲,這就是未定義的行爲。 – 2011-04-14 19:08:52

0

某些的優化,如幀指針省略,可以使它更難調試器來了解堆棧。

0

如果您有代碼,請在調試中編譯程序並在其上運行Valgrind。

如果您沒有該代碼,請聯繫該程序的作者/提供者。

損壞的堆棧消息只是意味着代碼對內存做了一些奇怪的事情。這並不意味着程序存在分段錯誤。另外,如果程序選擇處理SIGSEGV信號,程序仍然可以運行。

如果通過派生你的意思是你有一些過程,產卵和運行其他更小的工藝,只是監視這樣的尖峯和重新啓動進程。這假定您無法訪問修復程序。

0

可能會通過彙編代碼操作發生堆棧的一些有趣操作,例如真正的尾遞歸優化,自修改代碼,非返回函數等,這可能會導致調試器無法正常運行反向追蹤堆棧並導致它引發損壞的堆棧錯誤,但這並不一定意味着內存已損壞......但肯定是非傳統的事情正在發生。