วิธีการดีบัก dll อ้างอิง (มี pdb)


132

ฉันมีวิธีแก้ปัญหาสองวิธีในพื้นที่ทำงานของฉันพูดว่า A และ B

โซลูชัน A เป็นโปรเจ็กต์เก่าที่ฉันเขียนโค้ดเสร็จเมื่อไม่นานมานี้ ในโซลูชัน B ฉันต้องใช้บางคลาสจากโซลูชัน A ในการทำเช่นนั้นฉันเพิ่มการอ้างอิงไปยัง dll ของโครงการใดโครงการหนึ่งในโซลูชัน A

ปัญหาคือเมื่อฉันพยายามแก้ไขข้อบกพร่อง ฉันต้องการที่จะก้าวเข้าสู่รหัสของ A เช่นกัน Visual Studio ไม่สามารถโหลดโค้ดสำหรับคลาสเหล่านี้ได้ ("ไม่มีซอร์สโค้ดสำหรับตำแหน่งปัจจุบัน") และฉันสามารถดูได้เฉพาะการแยกชิ้นส่วนซึ่งไม่มีประโยชน์

วิธีเดียวที่ฉันรู้ในการดีบักคลาสจากโซลูชัน A คือการเรียกใช้โซลูชัน B แยกกระบวนการทั้งหมด (ในรายการเมนูดีบัก) และแนบกระบวนการจากโซลูชัน A

อย่างไรก็ตามสิ่งนี้ไม่สะดวกมากและฉันสามารถแก้จุดบกพร่อง A หรือ B ได้ในครั้งเดียวเท่านั้น

มีวิธีอนุญาตให้เข้าสู่รหัสของ dlls ที่อ้างอิง (ซึ่งฉันมีรหัสต้นฉบับ) หรือไม่


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

การอ้างอิงที่ดีมากกับวิธีการแก้ปัญหาที่ควรได้รับการออกแบบสามารถพบได้ในMSDN


ลิงก์ MSDN นั้นเป็นสิ่งที่ต้องอ่านสำหรับ. net devs (โดยไม่คำนึงถึงตัวควบคุมต้นทางที่ใช้) ฉันแปลกใจที่ไม่เคยเห็นมาก่อน ขอบคุณ!

ผู้มาใหม่หากคุณรู้เกี่ยวกับการอ้างอิงโครงการแล้วและนั่นไม่ใช่ตัวเลือก (เช่นคุณต้องดีบักแพ็คเกจ NuGet) ให้ละเว้นคำตอบที่ยอมรับแล้วตรงไปที่คำตอบนี้: stackoverflow.com/a/26029208/398630
BrainSlugs83

คำตอบ:


113

หากคุณมีข้อมูลอ้างอิงโครงการควรใช้งานได้ทันที

หากเป็นการอ้างอิงไฟล์ (dll) คุณต้องมีสัญลักษณ์การดีบัก (ไฟล์ "pdb") อยู่ในโฟลเดอร์เดียวกับ dll ตรวจสอบว่าโปรเจ็กต์ของคุณกำลังสร้างสัญลักษณ์การดีบัก (คุณสมบัติของโปรเจ็กต์ => สร้าง => ขั้นสูง => ข้อมูลผลลัพธ์ / ข้อมูลดีบัก = เต็ม); และถ้าคุณคัดลอก dll ให้ใส่ pdb ด้วย

นอกจากนี้คุณยังสามารถโหลดสัญลักษณ์ใน IDE ได้โดยตรงหากคุณไม่ต้องการคัดลอกไฟล์ใด ๆ แต่จะใช้งานได้มากกว่า

ตัวเลือกที่ง่ายที่สุดคือใช้การอ้างอิงโครงการ!


3
โชคดีที่ฉันคิดว่าไม่สามารถเพิ่มการอ้างอิงโครงการไปยังโครงการจากโซลูชันอื่นได้ (แก้ไขฉันถ้าฉันผิด!)
Elad

7
@Elad ฉันเพิ่งทำสิ่งนี้ ขั้นแรกให้เพิ่ม "โครงการที่มีอยู่" ลงในโซลูชัน จากนั้นเพิ่มการอ้างอิงไปยังโครงการโดยคลิกเพิ่มการอ้างอิงโครงการ คุณสามารถตั้งค่าเบรกพอยต์ในไฟล์โครงการที่มีอยู่ นี่เป็นสิ่งที่ดีเพราะไม่ได้คัดลอกไฟล์มา
user420667

3
ฉันมีโครงการ DLL เป็นข้อมูลอ้างอิงของโครงการ แต่จุดพักภายในจะถูกละเว้น
Slav

1
ฉันสามารถดีบักแอสเซมบลี (release-) ได้ในวันนี้ซึ่งถูกเพิ่มเป็นการอ้างอิงไฟล์ ดีสำหรับฉัน แต่มันเกิดขึ้นได้อย่างไร? MSVC2010, C #, (ASP) .NET 4.0, แอสเซมบลีที่อ้างอิงมีอยู่ในการแก้จุดบกพร่อง + รีลีส (แต่เพิ่มเฉพาะไฟล์รีลีสในโปรเจ็กต์) อยากจะชี้แจงเรื่องนี้จริงๆ
Tobias81

1
สำหรับฉันมันใช้งานได้ในวันหนึ่ง แต่แล้ววันถัดไปก็ไม่ทำงาน (มีไฟล์ DLL และ PDB) กดปุ่ม "Empty Symbol Cache" บน Tools> Options> Debugging> Symbols ได้รับการแก้ไขแล้ว
Paul

45

ฉันมีปัญหาเดียวกัน เขาคือสิ่งที่ฉันพบ:

1) ตรวจสอบให้แน่ใจว่าโครงการทั้งหมดใช้ Framework เดียวกัน (สิ่งนี้สำคัญมาก!)

2) ใน Tools / Options> Debugging> General ตรวจสอบให้แน่ใจว่า "Enable Just My Code (Managed Only) ไม่ได้ถูกเลือก

3) ใน Tools / Options> Debugging> Symbols จะล้างสัญลักษณ์แคชใด ๆ ยกเลิกการเลือกและลบตำแหน่งโฟลเดอร์ทั้งหมดในกล่องรายการ "ไฟล์ Symbols (.pdb)" ยกเว้นค่าเริ่มต้น "Microsoft Symbol Servers" แต่ก็ยังคงไม่เลือกเช่นกัน ลบเส้นทางคงที่ในกล่องข้อความ "สัญลักษณ์แคชในไดเรกทอรีนี้" ด้วย คลิกปุ่ม "Empty Symbols Cache" สุดท้ายตรวจสอบให้แน่ใจว่าได้เลือกปุ่มตัวเลือก "เฉพาะโมดูลที่ระบุ" แล้ว

4) ในเมนู Build / Configuration Manager สำหรับโปรเจ็กต์ทั้งหมดตรวจสอบให้แน่ใจว่าคอนฟิกูเรชันอยู่ในโหมด Debug


3
ปัญหาของฉันคือสองโครงการของฉันใช้. Net Frameworks: 4.0 และ 4.5 ​​ที่แตกต่างกัน Tx!
user627283

1) และ 4) มีความสำคัญ อย่าลืมสร้างในโหมด Debug และใช้กรอบงานเดียวกัน
scott_f

12

อีกจุดหนึ่งที่ควรทราบโปรดตรวจสอบว่าไม่ได้ติดตั้ง dll ที่อ้างถึงใน GAC หลังจากการทดสอบฉันติดตั้ง dll ของฉันลงใน GAC เพื่อทำการทดสอบระดับระบบ ต่อมาเมื่อฉันต้องดีบักโค้ดอีกครั้งฉันไม่สามารถก้าวเข้าสู่แอสเซมบลีที่อ้างอิงได้จนกว่าฉันจะลบออกจาก GAC


2
ขอบคุณ! นี่คือปัญหาของฉัน ฉันไม่อยากจะเชื่อเลยว่าฉันคิดไม่ออก: - / ฉันคิดว่าการตั้งค่าการอ้างอิงโครงการจะแทนที่สิ่งที่ติดตั้งใน GAC
SnookerC

แน่นอน! นี่เป็นจุดที่ดีมาก แม้ว่าคุณจะมี. NET Framework เวอร์ชันเดียวกัน แต่หากคุณมีโค้ดใน GAC เมื่อคุณพยายามดีบักมันจะไม่เข้าสู่จุดพักหากไฟล์. PDB ใน GAC แตกต่างจากไฟล์ในโฟลเดอร์โปรเจ็กต์ของคุณ วิธีแก้ปัญหานี้คือ Un-GAC DLL สร้างจากนั้น GAC ประกอบอีกครั้ง
DigiOz Multimedia

7

ขั้นตอนที่ 1:ไปที่Tools -> Option -> Debugging

ขั้นตอนที่ 2: ยกเลิกการเลือก Enable Just My Code

ขั้นตอนที่ 3:ยกเลิกการเลือกต้องการไฟล์ต้นฉบับที่ตรงกับเวอร์ชันดั้งเดิมทุกประการ

ขั้นตอนที่ 4:ยกเลิกการเลือกขั้นตอนเหนือคุณสมบัติและตัวดำเนินการ


3

ฉันมี*.pdbไฟล์ในโฟลเดอร์เดียวกันและใช้ตัวเลือกจากArindamแต่ก็ยังใช้งานไม่ได้ จะเปิดออกฉันต้องการที่จะช่วยให้เปิดใช้งานการแก้จุดบกพร่องรหัสพื้นเมืองซึ่งสามารถพบได้ภายใต้คุณสมบัติโครงการ> ตรวจแก้จุดบกพร่อง


1
ข้อมูลนี้ควรรวมอยู่ในคำตอบที่ยอมรับ เป็นสิ่งที่ฉันกำลังมองหาโดยเฉพาะ ขอบคุณสำหรับการแบ่งปัน! +1
Heriberto Lugo

2

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

คุณสามารถตรวจสอบเบรกพอยต์ของคุณผ่านหน้าต่างเบรกพอยต์ซึ่งพร้อมใช้งานผ่าน Debug -> Windows -> เบรกพอยต์

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


1
วิธีนี้ใช้ได้เฉพาะเมื่อไฟล์ภายนอกที่คุณวางเบรกพอยต์ตรงกับเส้นทางที่แน่นอนใน PDB (เช่นใช้งานได้เฉพาะเมื่อคุณสร้าง DLL บนเครื่องของคุณ)
Josh M.

2

ตรวจสอบว่า DLL ของคุณไม่ได้ลงทะเบียนใน GAC Visual Studio จะใช้เวอร์ชันใน GAC และอาจไม่มีข้อมูลการดีบัก


1

ฉันไม่ต้องการรวมโปรเจ็กต์ไลบรารีคลาสภายนอกไว้ในโซลูชันบางอย่างของฉันดังนั้นฉันจึงก้าวเข้าสู่แอสเซมบลีที่ฉันใช้ด้วยวิธีอื่น

โซลูชันของฉันมีไดเร็กทอรี "Common Assemblies" ที่มี DLL ของฉันเองจากโปรเจ็กต์อื่น ๆ DLL ที่ฉันอ้างอิงยังมีไฟล์ PDB ประกอบสำหรับการดีบัก

ในการดีบักและตั้งค่าเบรกพอยต์ฉันตั้งค่าเบรกพอยต์ในแหล่งที่มาของแอปพลิเคชันที่ใช้งานซึ่งฉันเรียกเมธอดหรือตัวสร้างจากแอสเซมบลีจากนั้นขั้นตอน INTO (F11) การเรียก method / constructor

ดีบักเกอร์จะโหลดซอร์สไฟล์ของแอสเซมบลีใน VS และสามารถตั้งค่าเบรกพอยต์ใหม่ภายในแอสเซมบลีได้ที่จุดนั้น

ไม่ตรงไปตรงมา แต่ใช้งานได้หากคุณไม่ต้องการรวมการอ้างอิงโครงการใหม่และเพียงต้องการอ้างอิงแอสเซมบลีที่แชร์แทน


0

มันต้องทำงาน ฉันเคยดีบักไฟล์. exe และ dll ในเวลาเดียวกัน! สิ่งที่ฉันแนะนำคือ 1) รวมเส้นทางของ dll ในโครงการ B ของคุณ 2) จากนั้นรวบรวมในการดีบักโครงการ A ของคุณ 3) ควบคุมว่าพา ธ ชี้ไปที่ไฟล์ A dll และ de pdb .... 4) หลังจากนั้นคุณ เริ่มต้นในการดีบักโครงการ B และถ้าทุกอย่างเรียบร้อยคุณจะสามารถแก้ไขข้อบกพร่องในทั้งสองโครงการได้!


0

วิธีที่ตรงไปข้างหน้ามากที่สุดที่ฉันพบโดยใช้ VisualStudio 2019 เพื่อดีบักไลบรารีภายนอกที่คุณอ้างถึงใน NuGet คือทำตามขั้นตอนต่อไปนี้:

  1. เครื่องมือ> ตัวเลือก> การดีบัก> ทั่วไป> ยกเลิกการคลิก 'เปิดใช้งาน Just My Code'

  2. ไปที่ Assembly Explorer> เปิดจาก NuGet Packages Cache รายการ

  3. พิมพ์ชื่อแพ็กเกจ NuGet ที่คุณต้องการแก้จุดบกพร่องในช่องค้นหาและคลิก 'ตกลง' ป้อนคำอธิบายภาพที่นี่

  4. จาก Assembly Explorer คลิกขวาที่แอสเซมบลีที่นำเข้าแล้วเลือก 'สร้าง Pdb' ป้อนคำอธิบายภาพที่นี่

  5. เลือกเส้นทางแบบกำหนดเองที่คุณต้องการบันทึกไฟล์. PDB และเฟรมเวิร์กที่คุณต้องการให้สร้างขึ้น

    ป้อนคำอธิบายภาพที่นี่

  6. คัดลอกไฟล์. PDB จากโฟลเดอร์ที่สร้างไปยังโฟลเดอร์ Debug ของคุณและตอนนี้คุณสามารถตั้งค่าจุดพักบนรหัสไลบรารีของแอสเซมบลีนี้ได้


ฟังดูดียกเว้นว่าหา Assembly Explorer ไม่เจอ นี่ไม่ใช่ส่วนของ Resharper เหรอ?
Robert Massa
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.