วิธีการดีบักโปรเจ็กต์ไลบรารีคลาสภายนอกใน Visual Studio


138

ฉันมีโปรเจ็กต์ (A) ที่อ้างอิงแอสเซมบลีจากไลบรารีคลาสโปรเจ็กต์ภายนอก (B) ที่อยู่ในโซลูชันอื่นเทียบกับโซลูชันอื่น

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

ขอบคุณล่วงหน้า.

คำตอบ:


203

ลองปิดใช้งาน Just My Code (JMC)

  • เครื่องมือ -> ตัวเลือก -> ดีบักเกอร์
  • ยกเลิกการเลือก "เปิดใช้งานเพียงรหัสของฉัน"

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

แก้ไข

เมื่อคุณใช้รหัสไม่ถูกต้องให้ลองทำดังต่อไปนี้

  • Debug -> Windows -> โมดูล
  • ค้นหา DLL สำหรับโครงการที่คุณสนใจ
  • คลิกขวา -> Load Symbols -> เลือก Path ไปยัง. PDB สำหรับโปรเจ็กต์อื่นของคุณ

2
ไม่ได้เลือกช่องทำเครื่องหมายที่ระบุไว้แล้ว สิ่งที่ฉันสังเกตเห็นคือมันเข้าสู่เมธอดของไลบรารีภายนอก แต่มันจะข้ามขั้นตอนเมื่อฉันพยายามเรียกเมธอดที่เป็นส่วนหนึ่งของอินเทอร์เฟซ
Konstantinos

คุณอาจต้องไปที่คุณสมบัติของ DLL และตรวจสอบให้แน่ใจว่า Copy Local ถูกตั้งค่าเป็น True มิฉะนั้นโมดูลจะไม่สามารถค้นหา. pdb สำหรับการอ้างอิงของคุณ
Bryan Rayner

Just My Codeดูเหมือนจะไม่สร้างความแตกต่างใด ๆ (ฉันสามารถข้ามไปยังโค้ดภายนอกได้แม้ว่าจะเปิดใช้งานอยู่ก็ตาม) แต่การค้นหาโมดูลในตัวดีบั๊กช่วยได้
TheOperator

3
ไม่พบไฟล์สัญลักษณ์ที่ตรงกันในโฟลเดอร์นี้
Christine

1
หากคุณไม่มีไฟล์ PDB สำหรับโมดูลที่อ้างอิงคุณสามารถใช้ ReSharper เพื่อถอดรหัสไบนารีโดยใช้ตัวเลือก "Load Symbols with ReSharper Deecompiler" ในเมนูคลิกขวาใน Debug / Windows / Modules ทรงพลังมาก.
emilast

12

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


12

สมมติเส้นทางของ

โครงการ A

C:\Projects\ProjectA

โครงการ B

C:\Projects\ProjectB

และ dll ของ ProjectB อยู่ใน

C:\Projects\ProjectB\bin\Debug\

ในการดีบักProjectBจากProjectAให้ทำดังต่อไปนี้

  1. คัดลอกBdll พร้อม dll .PDBไปยังProjectAไดเร็กทอรีคอมไพล์ของ
  2. ProjectAตอนนี้การแก้ปัญหา เมื่อโค้ดมาถึงส่วนที่คุณต้องการเรียกใช้เมธอดหรือเหตุการณ์ของ dll เป็นต้นในขณะที่ดีบักให้กดF11เพื่อเข้าสู่โค้ดของ dll

หมายเหตุ: อย่าพลาดคัดลอกไฟล์. PDB


5

ฉันเรียกใช้ Visual Studio สองอินสแตนซ์ - หนึ่งสำหรับ dll ภายนอกและอีกหนึ่งสำหรับแอปพลิเคชันหลัก
ในคุณสมบัติโปรเจ็กต์ของ dll ภายนอกตั้งค่าต่อไปนี้:

สร้างเหตุการณ์:

  • copy /y "$(TargetDir)$(TargetName).dll" "C:\<path-to-main> \bin\$(ConfigurationName)\$(TargetName).dll"

  • copy /y "$(TargetDir)$(TargetName).pdb" "C:\<path-to-main> \bin\$(ConfigurationName)\$(TargetName).pdb"

แก้ไขข้อบกพร่อง:

  • เริ่มโปรแกรมภายนอก: C:\<path-to-main>\bin\debug\<AppName>.exe

  • ไดเร็กทอรีการทำงาน C:\<path-to-main>\bin\debug

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

ฉันรู้ดีว่าหนึ่งดีบักเกอร์จะทำงานให้ทั้งคู่ แต่ฉันคิดว่ามันง่ายกว่าที่จะทำให้ทั้งสองตรงด้วยวิธีนี้


1

[อ้างอิงจาก Martin Beckett คนที่ส่งคำตอบนี้มาให้ฉัน]

คุณสามารถแก้ไขข้อบกพร่องในไลบรารีภายนอก

ในแท็บการตั้งค่าโปรเจ็กต์ให้มองหา "ไดเรกทอรีสตูดิโอภาพ" ในฟิลด์ "ซอร์สโค้ด" รวมเส้นทางไปยังแหล่งที่มา openCV จากนั้นตรวจสอบให้แน่ใจว่าไฟล์. pdb สำหรับ dll debug แต่ละไฟล์อยู่ในไดเร็กทอรีเดียวกับ dll


0

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

Visual Studio ควรอนุญาตให้คุณแก้ไขข้อบกพร่องในไลบรารีภายนอก


0

การอ้างอิง NuGet

สมมติ -Project_A (สร้าง project_a.dll) -Project_B (สร้าง project_b.dll) และการอ้างอิง Project_B ไปยังแพ็คเกจ Project_A โดย NuGet จากนั้นคัดลอก project_a.dll, project_a.pdb ไปยังโฟลเดอร์ Project_B / Packages ในผลที่ควรคัดลอกไปยัง / bin

ตอนนี้ดีบัก Project_A เมื่อโค้ดมาถึงส่วนที่คุณต้องเรียกเมธอดหรือเหตุการณ์ของ dll เป็นต้นในขณะที่ดีบักให้กด F11 เพื่อเข้าสู่โค้ดของ dll

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