2011-10-17 70 views
9

問題:我需要創建一個腳本或表達式,如果callstack上的某個地方是具有特定名稱的函數,則該腳本或表達式不會中斷。Windbg設置依賴於調用堆棧的條件斷點

具體問題:如何獲取函數調用堆棧上的字符串列表?

Module!MyFunctionWithConditionalBreakpoint  
Module!Function1 
Module!Function2  
Module!Function3 


Module!MyFunctionWithConditionalBreakpoint  
Module!Function1 
Module!ClassA:MemberFunction  
Module!Function3 

我想Module!MyFunctionWithConditionalBreakpoint只有當呼叫從Module!ClassA:MemberFunction

卡梅斯打破我需要這在非託管代碼。託管解決方案是一樣的東西

System.Diagnostics.StackTrace()的ToString()包含( 「YourMethodName」)

回答

11

在WinDbg中,你可以使用特殊的$口角功能設置條件斷點:。

bp Module!MyFunctionWithConditionalBreakpoint "r $t0 = 0;.foreach (v { k }) { .if ($spat(\"v\", \"*Module!ClassA:MemberFunction*\")) { r $t0 = 1;.break } }; .if($t0 = 0) { gc }" 

在僞代碼將是這樣的:

t0 = 0 
foreach (token in k-command result) { 
    if (token.contains("Module!ClassA:MemberFunction")) { 
    t0 = 1 
    break 
    } 
} 
if (t0 == 0) { 
    // continue execution 
} else { 
    // break into the debugger 
} 
+0

效果很好。謝謝 – cprogrammer

1

爲什麼不在輸入Module時設置斷點!ClassA:MemberFunction爲Module!MyFunctionWithConditionalBreakpoint啓用斷點,並在離開Module!ClassA:MemberFunction時禁用它?

+0

這可以自動化嗎? –

相關問題