แสดงหมายเลขบรรทัดในชุดติดตามสแต็กสำหรับ. NET ในโหมด Release


139

มีวิธีแสดงบรรทัดในการติดตามสแต็กสำหรับ. NET build / deployed ในโหมด Release หรือไม่?

UPDATE:

ใบสมัครของฉันแบ่งออกเป็นสามโครงการห้องสมุดระดับและหนึ่งโครงการ "เว็บไซต์" ASP.NET ข้อผิดพลาดที่ฉันพยายามติดตามคือหนึ่งในโครงการห้องสมุดสามชั้น ฉันปรับใช้ไฟล์ pdb สำหรับโครงการไลบรารีคลาสที่สร้างข้อผิดพลาด "การอ้างอิงวัตถุไม่ได้ตั้งค่าเป็นอินสแตนซ์ของวัตถุ"

หมายเลขบรรทัดยังคงไม่ปรากฏในการติดตามสแต็ก ฉันจำเป็นต้องปรับใช้ไฟล์ pdb เพื่อให้โครงการทั้งหมดได้รับหมายเลขบรรทัดในการติดตามสแต็กหรือไม่

วิธีแก้ปัญหาการทำงาน

การปรับใช้ไฟล์ pdb สำหรับแต่ละแอปพลิเคชันแก้ไขปัญหาหมายเลขบรรทัด

คำตอบ:


147
  • ไปที่หน้าต่างคุณสมบัติสำหรับโครงการที่คุณต้องการดูหมายเลขบรรทัดการติดตามสแต็ก
  • คลิกที่ Build "แท็บแนวตั้ง"
  • เลือกการกำหนดค่า "Release" ตรวจสอบพารามิเตอร์คงที่ DEBUG
  • ยกเลิกการเลือกพารามิเตอร์ "เพิ่มประสิทธิภาพโค้ด" เพื่อหลีกเลี่ยงปัญหาการติดตามเป็นครั้งคราวด้วยรหัสที่แทรก (ขั้นตอนนี้ไม่จำเป็น)
  • กดปุ่ม Advanced ... และเลือก Output -> Debug Info -> pdb-only
  • ปรับใช้ไฟล์. pdb ที่สร้างขึ้นด้วยแอสเซมบลี

ดำเนินการด้วยความคิดเห็นด้านล่าง:

  • อีกสิ่งหนึ่งที่ควรตรวจสอบคือในส่วน "แพ็คเกจ / เผยแพร่เว็บ" ที่ช่องทำเครื่องหมาย "ยกเว้นสัญลักษณ์การดีบักที่สร้างขึ้น" ก็ไม่ได้ถูกเลือกเช่นกัน

2
ฉันต้องปรับใช้ไฟล์ pdb พร้อมกับชุดประกอบหรือไม่?
Michael Kniskern

7
ใช่. นั่นคือสิ่งที่สัญลักษณ์การแก้ปัญหาและหมายเลขบรรทัดอยู่ที่
จอห์นแซนเดอ

5
คุณอาจไม่ต้องการเปิดเผยข้อมูลนี้หากคุณไม่จำเป็นต้อง ใช้เพื่อดีบักปัญหาไคลเอนต์ใช่ แต่คุณไม่ต้องการทำเช่นนั้นเสมอเพราะข้อมูลการดีบักสามารถให้ข้อมูลที่ละเอียดอ่อนและเป็นเวกเตอร์การโจมตีได้ ขึ้นอยู่กับว่าแอพของคุณคืออะไร
i_am_jorf

6
@Carlo: ข้อมูลการตรวจแก้จุดบกพร่องทำงานร่วมกับรหัสรุ่น (ปรับให้เหมาะสม) เช่นกันอย่างไรก็ตามการดีบักค่อนข้าง จำกัด ( stackoverflow.com/questions/113866 ) อย่างไรก็ตาม callstacks มีความน่าเชื่อถือแม้ในรหัสที่ได้รับการปรับปรุงให้ดีที่สุดยกเว้นฟังก์ชั่นอินไลน์และสถานการณ์รอบตัวที่การโทรหางอาจหายไปเพราะลำดับการโทร xxx / ret ถูกแทนที่ด้วย jmp xxx
Suma

12
อีกสิ่งหนึ่งที่ควรตรวจสอบคือในส่วน "แพคเกจ / เผยแพร่ทางเว็บ" ที่ช่องทำเครื่องหมาย "ยกเว้นสัญลักษณ์การดีบักที่สร้างขึ้น" ก็ไม่ได้ถูกเลือกด้วยเช่นกัน
Gaz

17

ใน VS2012 คุณต้องยกเลิกการเลือก "ยกเว้นสัญลักษณ์การดีบักที่สร้างขึ้น" ในส่วนแพ็คเกจ / เผยแพร่เว็บของคุณสมบัติเช่นกัน


หรือถ้าเป็นแอพเดสก์ท็อปตรวจสอบให้แน่ใจว่ามีการปรับใช้ไฟล์ PDB
CAD bloke


9

ฉันเคยเจอปัญหาในอดีตที่ฉันรู้สึกว่าจำเป็นต้องปรับใช้ไฟล์ PDB ด้วยโครงสร้างการวางจำหน่ายเพื่อติดตามข้อผิดพลาด เหตุผลก็คืออย่างที่คุณพูดว่าเป็นข้อยกเว้นที่เกิดขึ้นในวิธีการที่มีขนาดใหญ่มากและฉันไม่สามารถระบุได้อย่างถูกต้องว่าเกิดอะไรขึ้น

นี่อาจเป็นข้อบ่งชี้ว่าวิธีการนั้นจำเป็นต้องได้รับการเปลี่ยนเป็นวิธีที่เล็กกว่าและละเอียดกว่า ไม่ใช่ขนาดเดียวที่เหมาะกับคำตอบทั้งหมด แต่วิธีการนี้ให้บริการฉันได้ดีในระยะสั้น (ฉันมักจะพบข้อบกพร่องในระหว่างการปรับโครงสร้างใหม่) และในระยะยาว

แค่ความคิด


นี้. และในขณะที่คุณไปให้ลองจับที่ที่ร่างมากกว่าในเมล็ดที่ละเอียดกว่า และเพิ่มผู้คุมที่จุดเริ่มต้นของฟังก์ชั่นเหล่านี้หากต้องมีการตั้งสมมติฐาน
เจอราร์ดโอนีล

บ่อยครั้งที่พูดและเป็นความจริง แต่มีมรดกมีโปรแกรมเมอร์เขียนวิธีการใหม่ที่มีขนาดใหญ่และบางครั้งวิธีการที่มีขนาดใหญ่เป็นสิ่งที่ดีที่สุดที่จะทำจริง (แยกมันเป็นความสับสนหรือ YAGNI) ยิ่งไปกว่านั้นสำหรับวิธี 5 บรรทัดคุณ จำกัด การค้นหาของคุณให้แคบลง - ดังนั้น PDB จึงเป็นสิ่งจำเป็นในการผลิตเว้นแต่คุณจะเจ็บปวดกับการใช้เซิร์ฟเวอร์สัญลักษณ์
FastAl


0

ใน VS 2008 Express ฉันพบว่าภายใต้คุณสมบัติโครงการ -> คอมไพล์ -> ตัวเลือกการคอมไพล์ขั้นสูง


1
คุณพบอะไร คุณสามารถแสดงความคิดเห็นหากคุณไม่ต้องการโพสต์คำตอบที่สมบูรณ์
jumxozizi

-4

ใช้ได้ผลทุกครั้ง คุณเพียงแค่ซับสตริงข้อความติดตามสแต็ก ง่ายจริง! นอกจากนี้ใน vb.net คุณต้องทำ "แสดงไฟล์ทั้งหมด" และรวมถึง pdb ด้วย

'Err is the exception passed to this function

Dim lineGrab As String = err.StackTrace.Substring(err.StackTrace.Length - 5)
Dim i As Integer = 0
While i < lineGrab.Length                   
    If (IsNumeric(lineGrab(i))) Then
        lineNo.Append(lineGrab(i))
    End If
    i += 1
End While

'LineNo holds the number as a string

รุ่น C #:

string lineGrab = error.StackTrace.Substring(error.StackTrace.Length - 5);

int i = 0;
int value;
while (i < lineGrab.Length)
{
    if (int.TryParse(lineGrab[i].ToString(), out value))
    {
        strLineNo.Append(lineGrab[i]);
    }
    i++;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.