2016-01-22 22 views
0

我試圖在valgrind 3.10.0中運行我的程序,但它似乎掛在了set_address_range_perms()。最後的輸出我得到的是valgrind掛在thread_wrapper中

--69447:1:aspacem allocated thread stack at 0x803c7c000 size 1064960 
--69447:1:syswrap- run_a_thread_NORETURN(tid=2): pre-thread_wrapper 
--69447:1:syswrap- thread_wrapper(tid=2): entry 

任何想法,我怎麼能縮小問題?

+0

哪個工具?默認的'memcheck'或者其中一個線程? –

回答

0

首先要嘗試的是使用gdb + vgdb並連接到掛起的程序:在另一個窗口中,啓動gdb ,然後在gdb中執行target remote | vgdb 然後,您可以使用各種gdb命令來查看正在發生的事情,例如信息線程;線程全部應用bt; ... 有關valgrind + gdb的更多信息,請參閱 http://www.valgrind.org/docs/manual/manual-core-adv.html#manual-core-adv.gdbserver

如果valgrind gdbserver沒有反應,那麼你將不得不直接附加到valgrind,並調試valgrind的內部。

+0

它掛在while循環中 'threads_to_be_run = 1; n_threads_started = 0; void * thread_func(void * ptr) { struct thread_stuff * thr = ptr; __sync_fetch_and_add(&n_threads_started,1); ... int main(){ pthread_create(&thread,NULL,thread_func,ptr [i]); \t while(n_threads_started Irsa

+0

'有趣的是,當我運行valgrind以「--fair-sched = yes」時,它似乎工作 – Irsa

+0

是的,valgrind一次只能運行一個線程。在某些情況下,例如非常緊的循環,默認調度程序可能不會讓其他線程運行。使用公平調度程序意味着所有準備運行的線程最終都會運行(所以會增加n_threads_started)。 – phd