我想轉儲文件中的線程堆棧。我怎麼能在Linux中做到這一點?我怎樣才能找到堆棧的起始地址及其大小?請注意,我想從同一個進程編程(不使用ptrace,gdb或類似的東西)。如何轉儲線程堆棧
如何轉儲線程堆棧
回答
,如果你使用GNU C lib中,你可以使用回溯()函數
使用pthread_attr_getstack功能;這會產生線程的堆棧地址和大小。
這不會完成這項工作。如果線程正在使用系統分配的堆棧,'pthread_attr_getstack'將返回地址和大小0. –
@ denniston.t bout pthread_getattr_np? – MetallicPriest
@MetallicPriest我想這會工作,但它根據定義是不可移植的:-)。這可能無關緊要,取決於OP的需求。 –
Glibc有一個稱爲回溯的功能,可以根據需要進行回溯。
http://www.delorie.com/gnu/docs/glibc/libc_665.html
http://www.linuxjournal.com/article/6391?page=0,0
上次我試了一下,結果是不完美的,但有些是有用的。因人而異。
爲什麼你想轉儲你的線程堆棧?
想要得到application checkpointing嗎?如果你需要的話,有一些庫實現它,甚至不完善,但在實踐中很有用。
問題是,即使你設法將你的線程的堆棧轉儲到一個文件中,我也不確定你能用這個文件做些有用的事情。你甚至不能使用這些堆棧重新啓動你的應用程序,因爲重啓時(即使在相同的配置下)堆棧可能位於其他地方,除非你寫入0位數字到/proc/sys/kernel/randomize_va_space
我聽說也有一些這些庫強制正在運行的進程轉儲核心文件(以後可以使用gdb
進行檢查),而不會中止該進程。
調用堆棧非常脆弱,如果沒有預防措施,您不能重新使用它。
是的,基本上用於檢查點。我想到的一個想法是使用pthread_attr_setstack來設置堆棧,然後將進程作爲檢查點分叉。但是由於所有線程都不是誰叫fork,我想重新創建線程並從死線程中複製堆棧。但是,我仍然需要知道如何獲取死區線程的CPU寄存器。 – MetallicPriest
然後我建議使用(也許改進)現有的檢查點基礎設施。像往常一樣,魔鬼是在細節。 –
你可以指點一些開源的點檢查基礎設施。我會很感激。 – MetallicPriest
- 1. 主線程沒有調用堆棧的Java線程轉儲? (jsvc)
- 2. Java堆轉儲是否包含線程堆棧
- 3. UWSGI堆棧轉儲
- 4. 線程堆棧上存儲了什麼?
- 5. 線程堆和堆棧
- 6. 如何獲得堆轉儲和線程轉儲爲Tomcat在Mac
- 7. 堆棧轉儲使用alloc
- 8. 在信號ocaml上轉儲線程堆棧
- 9. 所有活動線程的轉儲堆棧跟蹤
- 10. 執行線程轉儲時的VisualVM堆棧變量值
- 11. 如何測量線程堆棧深度?
- 12. 如何轉儲或搜索Visual Studio中所有線程的調用堆棧
- 13. 繪製堆棧和線程程序堆
- 14. 如何轉儲所有Go進程的堆棧?
- 15. 如何反轉堆棧?
- 16. 線程的奇怪堆棧
- 17. 線程堆棧指針
- 18. 線程堆棧錯誤
- 19. 線程堆棧分配
- 20. 線程堆棧和進程堆棧有什麼區別
- 21. 堆vs堆棧存儲
- 22. 存儲在堆棧或堆
- 23. 彈性搜索堆棧溢出轉儲
- 24. 的Linux堆棧跟蹤轉儲
- 25. 轉儲內核模塊堆棧
- 26. 使用ptrace生成堆棧轉儲
- 27. Java堆棧轉儲 - 等待鎖定
- 28. 窗口上的java堆棧轉儲
- 29. 幫助SQL服務器堆棧轉儲
- 30. 從堆轉儲中提取線程轉儲
你有沒有考慮過使用調試器? – sidyll
我想以編程方式執行,而不是使用調試器。 – MetallicPriest
你想獲得callstack,還是僅僅是所有堆棧的轉儲? –