ฉันมีรหัส C # ปกติ ผมไม่มีข้อยกเว้น ฉันต้องการบันทึกการติดตามสแต็กปัจจุบันโดยทางโปรแกรมเพื่อวัตถุประสงค์ในการดีบัก ตัวอย่าง:
public void executeMethod()
{
logStackTrace();
method();
}
ฉันมีรหัส C # ปกติ ผมไม่มีข้อยกเว้น ฉันต้องการบันทึกการติดตามสแต็กปัจจุบันโดยทางโปรแกรมเพื่อวัตถุประสงค์ในการดีบัก ตัวอย่าง:
public void executeMethod()
{
logStackTrace();
method();
}
คำตอบ:
ดูSystem.Diagnostics
เนมสเปซ มีสินค้ามากมายในนั้น!
System.Diagnostics.StackTrace t = new System.Diagnostics.StackTrace();
นี่เป็นเรื่องดีจริง ๆ ที่มีการกระตุ้นเพื่อเรียนรู้สิ่งที่เกิดขึ้นภายใต้ประทุน
ฉันขอแนะนำให้คุณดูที่วิธีแก้ไขปัญหาการเข้าสู่ระบบ (เช่น NLog, log4net หรือรูปแบบและแนวทางปฏิบัติของ Microsoft Enterprise Library) ซึ่งอาจบรรลุวัตถุประสงค์ของคุณ ขอให้โชคดี
อีกทางเลือกหนึ่งSystem.Diagnostics.StackTrace
คือใช้System.Environment.StackTraceซึ่งส่งคืนการแทนค่าสตริงของ stacktrace
อีกตัวเลือกที่มีประโยชน์คือการใช้$CALLER
และ$CALLSTACK
ตัวแปรการดีบักใน Visual Studioเนื่องจากสามารถเปิดใช้งานได้โดยไม่ต้องสร้างแอปพลิเคชันขึ้นมาใหม่
Environment.StackTrace
StackTrace
เพียงใหม่ขึ้นตัวอย่างของ
System.Environment.StackTrace
อาจเป็นวิธีที่สะดวกกว่าในการเข้าถึงข้อมูลนั้น
System.Diagnostics.StackTrace
- ดูmsdn.microsoft.com/en-us/library/…
Environment.StackTrace
เริ่มต้นด้วยเสมอat System.Environment.GetStackTrace(Exception e, Boolean needFileInfo) at System.Environment.get_StackTrace()
? นั่นไม่ใช่ส่วนหนึ่งของการติดตามสแต็กปัจจุบัน ณ จุดที่ใครบางคนกำลังมองหา
มีสองวิธีในการทำเช่นนี้ System.Diagnostics.StackTrace()
จะทำให้คุณมีร่องรอยสแต็กสำหรับหัวข้อปัจจุบัน หากคุณมีการอ้างอิงถึงThread
ตัวอย่างเช่นคุณสามารถได้รับการติดตามสแต็คที่ผ่าน StackTrace()
overloaded
คุณอาจต้องการดูคำถาม Stack Overflow วิธีรับ stacktrace ของเธรดที่ไม่เป็นปัจจุบัน .
คุณสามารถทำได้ในดีบักเกอร์ Visual Studio โดยไม่ต้องแก้ไขรหัส
แน่นอนว่าสิ่งนี้ไม่ได้ช่วยอะไรถ้าคุณใช้งานรหัสบนเครื่องอื่น แต่มันค่อนข้างมีประโยชน์มากที่จะสามารถสแต็กการติดตามสแต็กโดยอัตโนมัติโดยไม่ส่งผลกระทบต่อรหัสการเผยแพร่หรือไม่จำเป็นต้องรีสตาร์ทโปรแกรม
Console.WriteLine(
new System.Diagnostics.StackTrace().ToString()
);
ผลลัพธ์จะคล้ายกับ:
ที่ YourNamespace.Program.executeMethod (String msg)
ที่ YourNamespace.Program.Main (String [] args)
แทนที่Console.WriteLine
ด้วยLog
วิธีการของคุณ ที่จริงแล้วไม่มีความจำเป็นสำหรับ.ToString()
กรณี Console.WriteLine
object
ในขณะที่มันยอมรับ แต่คุณอาจต้องใช้วิธี Log (string msg)
private void ExceptionTest()
{
try
{
int j = 0;
int i = 5;
i = 1 / j;
}
catch (Exception ex)
{
Console.WriteLine("Error: " + ex.Message);
var stList = ex.StackTrace.ToString().Split('\\');
Console.WriteLine("Exception occurred at " + stList[stList.Count() - 1]);
}
}
ดูเหมือนว่าจะทำงานให้ฉัน
StackTrace
นั้นช้า - ดังนั้นควรใช้อย่างประหยัด