2011-10-17 30 views
9

Sự cố: Tôi cần tạo một tập lệnh hoặc biểu thức không bị hỏng nếu ở đâu đó trên callstack là một hàm có tên cụ thể.Windbg Đặt điểm ngắt có điều kiện phụ thuộc vào Ngăn xếp cuộc gọi

Câu hỏi cụ thể: Làm cách nào để nhận các hàm trên callstack vào danh sách chuỗi?

Ví dụ:

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


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

Tôi muốn Module!MyFunctionWithConditionalBreakpoint để phá vỡ chỉ khi gọi cames từ Module!ClassA:MemberFunction

tôi cần điều này trong mã unmanaged. giải pháp quản lý là một cái gì đó giống như

System.Diagnostics.StackTrace() ToString() Chứa ("YourMethodName")

Trả lời

11

Trong WinDbg bạn có thể đặt một breakpoint có điều kiện sử dụng chức năng đặc biệt $ cãi nhau:..

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

Trong pseudo-code nó sẽ là một cái gì đó như:

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

hoạt động tốt. cảm ơn – cprogrammer

1

Tại sao không đặt breakpoint khi vào Module! ClassA: MemberFunction để kích hoạt một breakpoint cho Module! MyFunctionWithConditionalBreakpoint và khi rời khỏi Module! ClassA: MemberFunction vô hiệu hóa nó?

+0

Điều này có thể tự động không? –

Các vấn đề liên quan