2011-10-27 97 views
3

我想轉儲文件中的線程堆棧。我怎麼能在Linux中做到這一點?我怎樣才能找到堆棧的起始地址及其大小?請注意,我想從同一個進程編程(不使用ptrace,gdb或類似的東西)。如何轉儲線程堆棧

+0

你有沒有考慮過使用調試器? – sidyll

+0

我想以編程方式執行,而不是使用調試器。 – MetallicPriest

+0

你想獲得callstack,還是僅僅是所有堆棧的轉儲? –

回答

0

使用gdb附加到通過它的PID(進程ID)運行的進程:

gdb -p 1234 

然後鍵入bt獲得回溯。

+0

不想使用gdb,我想從我的程序中執行 – MetallicPriest

1

使用pthread_attr_getstack功能;這會產生線程的堆棧地址和大小。

+1

這不會完成這項工作。如果線程正在使用系統分配的堆棧,'pthread_attr_getstack'將返回地址和大小0. –

+0

@ denniston.t bout pthread_getattr_np? – MetallicPriest

+0

@MetallicPriest我想這會工作,但它根據定義是不可移植的:-)。這可能無關緊要,取決於OP的需求。 –

0

爲什麼你想轉儲你的線程堆棧?

想要得到application checkpointing嗎?如果你需要的話,有一些庫實現它,甚至不完善,但在實踐中很有用。

問題是,即使你設法將你的線程的堆棧轉儲到一個文件中,我也不確定你能用這個文件做些有用的事情。你甚至不能使用這些堆棧重新啓動你的應用程序,因爲重啓時(即使在相同的配置下)堆棧可能位於其他地方,除非你寫入0位數字到/proc/sys/kernel/randomize_va_space

我聽說也有一些這些庫強制正在運行的進程轉儲核心文件(以後可以使用gdb進行檢查),而不會中止該進程。

調用堆棧非常脆弱,如果沒有預防措施,您不能重新使用它。

+0

是的,基本上用於檢查點。我想到的一個想法是使用pthread_attr_setstack來設置堆棧,然後將進程作爲檢查點分叉。但是由於所有線程都不是誰叫fork,我想重新創建線程並從死線程中複製堆棧。但是,我仍然需要知道如何獲取死區線程的CPU寄存器。 – MetallicPriest

+0

然後我建議使用(也許改進)現有的檢查點基礎設施。像往常一樣,魔鬼是在細節。 –

+0

你可以指點一些開源的點檢查基礎設施。我會很感激。 – MetallicPriest