ฉันจะแนบ Visual Studio เข้ากับกระบวนการที่ยังไม่เริ่มได้อย่างไร


91

ฉันมีโปรแกรม. NET ที่ไม่สามารถเรียกใช้จาก Visual Studio ได้ด้วยเหตุผลบางประการ (ไฟล์ Excel ที่สร้างจากโครงการเทมเพลต Excel 2010) ซึ่งฉันต้องการแก้ไขจุดบกพร่องของเหตุการณ์เริ่มต้น

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

แน่นอนว่าการเพิ่มThread.Sleep(1000)ในกิจกรรมเริ่มต้นของฉันเพื่อให้ฉันมีเวลาแนบกระบวนการใน Visual Studio ก็หมดปัญหา!

คำตอบ:


99

จริงๆแล้วคุณทำได้ คุณไม่ยึดติดกับมันคุณเริ่มเลย ในคุณสมบัติของโครงการของคุณบนแท็บการดีบักระบุเส้นทางของโปรแกรมที่คุณต้องการแนบในกล่องข้อความ "คำสั่ง"

คุณยังสามารถป้อนอาร์กิวเมนต์บรรทัดคำสั่งสำหรับโปรแกรมในช่อง "อาร์กิวเมนต์คำสั่ง":

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

ตรวจสอบให้แน่ใจว่า "แนบ" ตั้งค่าเป็น "ไม่ใช่"


6
วิธีแก้ปัญหาที่ดี แต่โปรดทราบว่าการกดปุ่ม F5 ไม่ได้ผลในกรณีนี้ คลิกขวาที่โปรเจ็กต์ที่เกี่ยวข้องแทนแล้วคลิก 'ดีบัก> เริ่มอินสแตนซ์ใหม่' จากเมนูบริบท
Herman Cordes

2
เพื่อให้ F5 ทำงานได้โครงการของคุณจะต้องเป็นโครงการเริ่มต้นในโซลูชัน ในการทำเช่นนั้นในตัวสำรวจโซลูชันให้คลิกขวาที่โครงการแล้วเลือก "ตั้งเป็นโครงการเริ่มต้น"
Tibi

1
นอกจากนี้หากโปรแกรมของคุณมีการอ้างอิงภายนอกคุณจำเป็นต้องเปลี่ยน "Working Directory" ด้วย
Priyank

อาจจำเป็นต้องตรวจสอบ"เปิดใช้งานการดีบักโค้ดเนทีฟ" (คุณสมบัติโปรเจ็กต์→ ดีบักเปิดใช้ตัวแก้ไขข้อบกพร่อง )
Peter Mortensen

และคุณจะทำเช่นนี้กับโซลูชันทั้งหมด 40 โครงการได้อย่างไร
Tony Tannous

23

ฉันกำลังดีบักปลั๊กอิน C ++ ในกระบวนการสร้างจากภายนอกซึ่งล้มเหลวโดยทิ้งข้อยกเว้นเมื่อเริ่มต้นและสิ่งนี้ใช้ได้ผลอย่างสมบูรณ์สำหรับฉัน:

เพิ่มฟรีขยาย reattach สำหรับ Visual Studio ขอให้แนบชื่อกระบวนการอีกครั้งก่อนที่จะเปิดตัว มันจะปรากฏกล่องโต้ตอบโมดอลแจ้งว่ากำลังรอให้ชื่อกระบวนการเปิดขึ้น

ตอนนี้เปิดใช้กระบวนการและโปรแกรมแก้ไขข้อบกพร่อง Visual Studio จะแนบทันทีจับข้อยกเว้นและกดปุ่มเบรกพอยต์


ใช่เป็นพันเท่า!
itslittlejohn

ฉันมีทางตัน มันร้องขอการตรวจสอบสิทธิ์ของผู้ดูแลระบบเมื่อเป้าหมายของฉันถูกเปิดใช้งานและหลังจากพิมพ์ pwd และรีสตาร์ท vs Reattach ก็หายไป เทียบกับที่ไม่มีการตรวจสอบสิทธิ์ของผู้ดูแลระบบเท่านั้นที่มี Reattach
Eric

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

22

ทำตามขั้นตอนเหล่านี้หากคุณมี Visual Studio 2017-2019:

  1. ไฟล์> เปิด> โครงการ / โซลูชัน
  2. เลือก. exe ของคุณ
  3. แก้ไขข้อบกพร่อง> เริ่มการดีบัก

ง่ายกว่าคำแนะนำอื่น ๆ มาก: คุณไม่ต้องยุ่งกับคุณสมบัติของโครงการและไม่จำเป็นต้องมีส่วนขยายใด ๆ


แต่คุณจะต้องบอก Visual Studio ว่าสัญลักษณ์การดีบักอยู่ที่ไหนหากไม่พบโดยอัตโนมัติ
Matt Thomas

1
ง่ายรวดเร็วสามารถทำได้ใน 5 วินาทีฉันชอบมัน ขอบคุณ
ComradeJoecool

1
exe ของฉันเปิดตัวแล้ว แต่ไม่สามารถตั้งค่าเบรกพอยต์ได้ ฉันควรทำอย่างไรดี?
Eric

2
@Eric หากความคิดเห็นของฉันข้างต้นไม่ได้กล่าวถึงฉันขอแนะนำให้ถามเป็นคำถาม SO แทนความคิดเห็น ปัญหาของคุณจะได้รับการเปิดเผยมากขึ้นและคุณจะมีโอกาสอธิบายสถานการณ์เฉพาะของคุณ แล้วแจ้งให้เราทราบสิ่งที่คุณพบ!
Matt Thomas

11

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

ฉันดูส่วนขยาย Reattach ตามที่แนะนำโดย mrstrangeและส่วนขยายAttach To Anything ที่คล้ายกันมาก... แต่ไฟล์ปฏิบัติการของฉันดูเหมือนจะปิดเร็วเกินไปสำหรับส่วนขยายที่จะแจ้งและแนบ

สิ่งที่ช่วยฉันได้ในที่สุดคือ: https://stackoverflow.com/a/4042545/1560865ซึ่งอ้างอิงบทความ MSDN วิธีการ: เปิดตัวดีบักเกอร์โดยอัตโนมัติซึ่งจะแสดงขั้นตอนต่อไปนี้:

  1. เริ่ม Registry Editor (regedit)
  2. ใน Registry Editor เปิดโฟลเดอร์ HKEY_LOCAL_MACHINE
  3. ไปที่ตัวเลือกการดำเนินการไฟล์ HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows NT \ currentversion \ image
  4. ในภาพที่แสดงตัวเลือกประมวลแฟ้มโฟลเดอร์ค้นหาชื่อของโปรแกรมที่คุณต้องการที่จะแก้ปัญหาเช่นMyApp.exe หากคุณไม่พบแอปพลิเคชันที่คุณต้องการแก้ไขข้อบกพร่อง:
    a. คลิกขวาที่ภาพตัวเลือกประมวลแฟ้มโฟลเดอร์บนเมนูทางลัดคลิกคีย์ใหม่
    ข. คลิกขวาที่คีย์ใหม่และในเมนูทางลัดคลิกเปลี่ยนชื่อ ค. แก้ไขชื่อคีย์เป็นชื่อแอปพลิเคชันของคุณ myapp.exeในตัวอย่างนี้
  5. คลิกขวาที่MyApp.exeโฟลเดอร์และในเมนูทางลัดคลิกค่าสตริงใหม่
  6. คลิกขวาที่ค่าสตริงใหม่และบนเมนูทางลัดคลิกเปลี่ยนชื่อ
  7. เปลี่ยนชื่อเป็นdebugger.
  8. คลิกขวาที่ค่าสตริงใหม่และบนเมนูทางลัดคลิกปรับเปลี่ยน แก้ไขสายกล่องโต้ตอบปรากฏขึ้น
  9. ในข้อมูลค่าvsjitdebugger.exeกล่องชนิด
  10. คลิกตกลง
  11. จากRegistryเมนูคลิกExit
  12. ไดเร็กทอรีที่มี vsjitdebugger.exe ต้องอยู่ในเส้นทางระบบของคุณ ในการเพิ่มลงในเส้นทางของระบบให้ทำตามขั้นตอนเหล่านี้:
    a. เปิดแผงควบคุมในมุมมองคลาสสิกและดับเบิลคลิกระบบ
    ข. คลิกที่การตั้งค่าระบบขั้นสูง
    ค. ในคุณสมบัติของระบบคลิกแท็บขั้นสูง
    ง. ในขั้นสูงแท็บคลิกตัวแปรของสภาพแวดล้อม
    จ. ในกล่องโต้ตอบตัวแปรสภาพแวดล้อมภายใต้ตัวแปรระบบเลือกเส้นทางจากนั้นคลิกปุ่มแก้ไข
    ฉ. ในตัวแปรแก้ไขระบบกล่องโต้ตอบเพิ่มไดเร็กทอรีลงในกล่องค่าตัวแปร ใช้อัฒภาคเพื่อแยกออกจากรายการอื่น ๆ ในรายการ
    ก. คลิกตกลงเพื่อปิดกล่องโต้ตอบแก้ไขตัวแปรระบบ
    ซ. คลิกตกลงเพื่อปิดกล่องโต้ตอบตัวแปรสภาพแวดล้อม
    ผม. คลิกตกลงเพื่อปิดกล่องโต้ตอบ คุณสมบัติของระบบ
  13. ตอนนี้ใช้วิธีการใดก็ได้เพื่อเริ่มแอปพลิเคชันของคุณ Visual Studio จะเริ่มและโหลดแอปพลิเคชัน

หวังว่าสิ่งนี้จะช่วยคนอื่นในอนาคต!


3
คำแนะนำสำหรับกระบวนการเดียวกันนี้กับ VS เวอร์ชันใหม่กว่า (ถึงปี 2019): docs.microsoft.com/en-us/visualstudio/debugger/…
brichins

3

หากไม่มีกระบวนการ Visual Studio จะไม่สามารถแนบได้

อย่างไรก็ตามคุณสามารถตั้งค่าโปรแกรมเริ่มต้นของโปรเจ็กต์ของคุณให้เป็นอย่างอื่นที่ไม่ใช่ผลลัพธ์ของโปรเจ็กต์ของคุณได้


ฉันได้ตรวจสอบแล้วว่าสิ่งที่ฉันต้องการทำนั้นถูกต้องหรือไม่และจริงๆแล้วมันคือ สถานการณ์ของฉันไม่ใช่กรณีการดีบัก Visual Studio ตามปกติ ฉันมีโครงการเทมเพลต Excel 2010 ที่พัฒนาใน Visual Studio และแผ่นงานเทมเพลตมีเหตุการณ์เริ่มต้น ฉันเรียกใช้เทมเพลตนี้จาก Visual Studio เพิ่มข้อมูลบางอย่างในแผ่นงาน Excel ของฉันและบันทึกไฟล์ลงในดิสก์ จากนั้นวิธีเดียวที่ฉันสามารถเปิดไฟล์นี้ซึ่งต้องอาศัยแอสเซมบลีเทมเพลตคือการเปิดจาก explorer ดังนั้นฉันจึงไม่สามารถดีบักเหตุการณ์เริ่มต้นได้ในกรณีนี้และแน่นอนว่าฉันมีการประมวลผลข้อมูลบางอย่างเมื่อเริ่มต้นเช่น databinding
Ucodia

อาจจำเป็นต้องตรวจสอบ"เปิดใช้งานการดีบักโค้ดเนทีฟ" (คุณสมบัติโปรเจ็กต์→ ดีบักเปิดใช้ตัวแก้ไขข้อบกพร่อง )
Peter Mortensen

3

คุณสามารถแสดง MessageBox ซึ่งจะบล็อกแอปพลิเคชันจากนั้นคุณแนบหรือแนบตัวดีบักกลับเข้ากับกระบวนการและคลิกตกลงเพื่อดำเนินการต่อ:

MessageBox.Show("Attach process to debugger and click ok!");

คุณสามารถเพิ่มลงในตัวสร้างแบบฟอร์ม (หากคุณใช้ winforms) ดังนั้นสิ่งนี้จะถูกดำเนินการก่อนสิ่งอื่นใดยกเว้นการเริ่มต้นส่วนประกอบ:

public MainForm()
{
    InitializeComponent();
    MessageBox.Show("Attach process to debugger and click ok!");
}

เมื่อคุณแก้ไขจุดบกพร่องเสร็จแล้วให้แสดงความคิดเห็นในบรรทัดนั้น


3

คุณสามารถเริ่มโปรแกรมแก้ไขข้อบกพร่องจากรหัสของคุณผ่านทาง

public static void Main(string[] args)
{
  System.Diagnostics.Debugger.Launch();
}

แต่อย่าลบบรรทัดนี้ก่อนส่งใบสมัครของคุณ บางทีคุณอาจต้องการใช้แฟล็กคอมไพเลอร์เพื่อให้แน่ใจว่า:

    public static void Main(string[] args)
    {
      #if debug
      System.Diagnostics.Debugger.Launch();
      #endif
    }

2
นี่ควรเป็นคำตอบที่ได้รับการยอมรับสำหรับทุกกรณีที่คุณกำลังรอให้กระบวนการภายนอกเปิดตัวแอปพลิเคชันของคุณ
TravellingFox

2

วิธีแก้ปัญหาเล็ก ๆ น้อย ๆ ที่อาจเหมาะกับหลาย ๆ คน

  • ในบรรทัดแรกของโค้ดที่ exe จะทำงานให้เพิ่มคำสั่งนี้

    System.Threading.Thread.Sleep (20000)

นั่นจะทำให้ exe เข้าสู่โหมดสลีปเป็นเวลา 20 วินาทีก่อนที่มันจะเริ่มประมวลผลอะไร จากนั้นคุณมีเวลา 20 วินาทีในการแนบกับกระบวนการซึ่งสามารถทำได้อย่างรวดเร็วด้วย ctrl + alt + p จากนั้นค้นหากระบวนการจากนั้นเข้าสู่การแนบ

ไม่ค่อยมีคำตอบ แต่ได้ผลสำหรับฉัน: -)


ฉันต้องดีบัก CGI ที่เขียนด้วย "C" ซึ่งฉันมีซอร์สโค้ด ฉันเป็นวิธีแก้ปัญหาที่ง่ายและสะดวกในการมีเวลาแนบไปกับกระบวนการเบื้องหลัง
Joël Hecht
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.