2013-02-26 56 views
1

我正在通過英特爾的Inspector XE運行一個應用程序,它告訴我,我的一個線程正在訪問另一個線程的堆棧,但它不能告訴我涉及哪個線程或代碼在哪裏發生。如何識別線程正在觸摸另一個線程的堆棧?

我在想可能是某種每線程VirtualProtect或某種方式來在上下文切換期間調用代碼,但我找不到任何東西。

有沒有什麼方法可以讓我抓住行爲中的線索,還是我運氣不好?

+2

我希望這是可能的,如果你要傳遞一個指針到一個局部變量到另一個線程。你做那個?這實際上是一個問題嗎? – paddy 2013-02-26 01:13:19

+0

這是一個100k +線程和嚴重線程的應用程序,任何事情都是可能的。 – 2013-02-26 01:20:44

+0

當你的應用程序處於「任何事情都可能」的狀態時,你就會迷失方向。那麼應用程序就是一場失敗的遊戲。否則:分析代碼並找出一個線程將棧指針(或引用)傳遞給另一個線程的位置。可能有這樣做的理由,而這個原因可能會導致更好的洞察力。 – Frunsi 2013-02-26 03:09:53

回答

0

從線程創建例程開始。確保傳遞的指針不指向堆棧。你應該能夠使用grep來幫助解決這個問題。例如。假設你使用pthreads,grep -E pthread_create\([^,]+\,[^,]+\,[^,]+\,[^&]+\& *.c或類似的東西可能會給你的罪魁禍首,如果指針是在pthread_create函數調用中使用&運算符。

您可以考慮使用grep -E "[[:alnum:]_]+[[:space:]]+[[:alnum:]_]+\[[^]]+]" *.c構建數組標識符列表,並根據函數內聲明的任何數組構建模式列表。

否則,grep -E pthread_create *.c至少會爲您提供創建線程的每一行,以及傳遞給入口點的指針的表達式。如果該指針指向一個malloc'd結構體或指針(例如,fubar **argument; argument = malloc(sizeof *argument);),那麼找到該結構體或指針被修改的位置,並確保它沒有被修改爲指向堆棧。