Bagaimana cara melampirkan Visual Studio ke proses yang belum dimulai?

91

Saya memiliki program .NET yang tidak dapat dijalankan dari Visual Studio karena beberapa alasan (file Excel yang dibuat dari proyek template Excel 2010) yang saya perlukan untuk men-debug acara startup.

Jika saya ingin men-debug kejadian yang muncul setelah inisialisasi program, tidak ada masalah. Saya menjalankan program dari penjelajah, melampirkan proses ke Visual Studio dan menambahkan beberapa titik putus dalam kode. Tapi di sini, saya perlu meletakkan breakpoint pada acara startup. Saya harus dapat melampirkan proses ke Visual Studio, tidak bergantung pada PID, tetapi pada nama proses tertentu atau solusi lain apa pun yang akan berfungsi.

Tentu saja menambahkan a Thread.Sleep(1000)di acara startup saya untuk memberi saya waktu untuk melampirkan proses di Visual Studio tidak mungkin dilakukan!

Ucodia
sumber

Jawaban:

99

Sebenarnya Anda bisa; Anda tidak melekat padanya, Anda memulainya. Pada properti proyek Anda, pada tab Debugging, tentukan jalur program yang ingin Anda lampirkan di kotak teks "Command".

Anda juga dapat memasukkan argumen baris perintah apa pun untuk program di kotak "Argumen Perintah":

masukkan deskripsi gambar di sini

Pastikan "Lampirkan" disetel ke "Tidak".

Tibi
sumber
6
Solusi bagus, tetapi perhatikan bahwa menekan F5 tidak berfungsi dalam kasus ini. Alih-alih, klik kanan proyek terkait dan klik 'Debug> Mulai contoh baru' dari menu konteks.
Herman Cordes
2
Agar F5 berfungsi, proyek Anda harus menjadi Proyek Awal dalam solusi. Untuk melakukan itu, di penjelajah solusi klik kanan pada proyek dan pilih "Set as startup project".
Tibi
1
Juga jika program Anda memiliki beberapa ketergantungan eksternal, Anda perlu mengubah "Direktori Kerja" juga.
Priyank
Anda mungkin perlu mencentang "Aktifkan proses debug kode native" (properti proyek → DebugAktifkan Debugger ).
Peter Mortensen
Dan bagaimana Anda melakukan ini untuk seluruh solusi dengan 40 proyek?
Tony Tannous
23

Saya sedang men-debug plugin C ++ dalam proses yang muncul secara eksternal yang macet dengan melemparkan pengecualian saat startup dan ini bekerja dengan sempurna untuk saya:

Tambahkan Reattach Extension gratis untuk Visual Studio . Minta untuk melampirkan kembali ke nama proses sebelum diluncurkan. Ini akan memunculkan dialog modal yang mengatakan sedang menunggu nama proses untuk diluncurkan.

Sekarang luncurkan proses dan debugger Visual Studio akan segera terpasang, menangkap pengecualian dan mencapai titik putus.

aneh
sumber
Seribu kali ya!
itslittlejohn
Saya menemui jalan buntu. Itu meminta otorisasi admin ketika target saya diluncurkan, dan setelah mengetik pwd dan memulai ulang vs, Pasang kembali telah hilang. Hanya vs tanpa autentikasi admin yang berisi Reattach.
Eric
2
Tidak berhasil untuk saya. Itu masih menempel terlalu terlambat, setelah kecelakaan itu sudah terjadi. Tampaknya memeriksa proses yang ada setiap detik, yang sama sekali tidak berguna untuk aplikasi ini.
riv
22

Ikuti langkah-langkah berikut jika Anda memiliki Visual Studio 2017-2019:

  1. File> Buka> Proyek / Solusi
  2. Pilih .exe Anda
  3. Debug> Mulai Debugging

Jauh lebih mudah daripada saran lain: Anda tidak perlu mengotak-atik properti proyek, dan tidak perlu ekstensi.

Matt Thomas
sumber
Tetapi Anda harus memberi tahu Visual Studio di mana simbol debugging berada, jika tidak menemukannya secara otomatis
Matt Thomas
1
cepat mudah dapat dilakukan dalam 5 detik, saya menyukainya. Terima kasih
ComradeJoecool
1
Exe saya diluncurkan, tetapi tidak ada breakpoint yang dapat disetel. Apa yang harus saya lakukan?
Eric
2
@Eric Jika komentar saya di atas tidak membahasnya maka saya sarankan menanyakan itu sebagai pertanyaan SO daripada komentar. Masalah Anda akan lebih terlihat dan Anda akan memiliki kesempatan untuk menjelaskan skenario spesifik Anda. Kemudian beri tahu kami apa yang Anda temukan!
Matt Thomas
11

Saya menemukan jawaban ini ketika saya mencari sesuatu yang serupa. Dalam kasus saya, saya tidak bisa begitu saja menggunakan program yang dapat dieksekusi sebagai program startup proyek saya karena itu harus dimulai di lingkungan yang sangat spesifik yang tidak dapat saya reproduksi dengan mudah (namanya: dimulai dari cygwin).

Saya melihat Reattach Extension seperti yang disarankan oleh mrstrange dan juga Attach To Anything yang sangat mirip ekstensi ... tetapi file executable saya tampaknya menutup terlalu cepat untuk pemberitahuan dan lampiran ekstensi.

Apa yang akhirnya membantu saya adalah ini: https://stackoverflow.com/a/4042545/1560865 , yang mereferensikan artikel MSDN Cara: Meluncurkan Debugger Secara Otomatis , yang pada gilirannya mencantumkan langkah-langkah berikut:

  1. Mulai Editor Registri (regedit).
  2. Di Editor Registri, buka folder HKEY_LOCAL_MACHINE.
  3. Arahkan ke HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows NT \ currentversion \ image file execution options.
  4. Di folder Opsi Eksekusi File Gambar , temukan nama aplikasi yang ingin Anda debug, seperti myapp.exe . Jika Anda tidak dapat menemukan aplikasi yang ingin Anda debug:
    a. Klik kanan folder Opsi Eksekusi File Gambar , dan pada menu pintasan, klik Kunci Baru .
    b. Klik kanan kunci baru, dan pada menu pintasan, klik Ubah nama . c. Edit nama kunci ke nama aplikasi Anda; myapp.exe , dalam contoh ini.
  5. Klik kanan folder myapp.exe , dan pada menu pintasan, klik Nilai String Baru .
  6. Klik kanan nilai string baru, dan pada menu pintasan, klik Ubah nama.
  7. Ubah nama menjadi debugger.
  8. Klik kanan nilai string baru, dan pada menu pintasan, klik Ubah . Kotak dialog Edit String muncul.
  9. Di kotak data nilai , ketik vsjitdebugger.exe.
  10. Klik OK .
  11. Dari menu Registry , klik Exit .
  12. Direktori yang berisi vsjitdebugger.exe harus ada di jalur sistem Anda. Untuk menambahkannya ke jalur sistem, ikuti langkah-langkah berikut:
    a. Buka Panel Kontrol dalam tampilan Klasik, dan klik dua kali Sistem .
    b. Klik Pengaturan Sistem Lanjut .
    c. Di System Properties , klik tab Advanced .
    d. Pada tab Advanced , klik Variabel Lingkungan .
    e. Di kotak dialog Variabel Lingkungan , di bawah Variabel sistem , pilih Jalur , lalu klik tombol Edit .
    f. Di Edit Variabel Sistemkotak dialog, tambahkan direktori ke kotak nilai Variabel . Gunakan titik koma untuk memisahkannya dari entri lain dalam daftar.
    g. Klik OK untuk menutup kotak dialog Edit Variabel Sistem .
    h. Klik OK untuk menutup kotak dialog Variabel Lingkungan .
    saya. Klik OK untuk menutup kotak dialog System Properties .
  13. Sekarang, gunakan metode apa pun untuk memulai aplikasi Anda. Visual Studio akan memulai dan memuat aplikasi.

Semoga ini bisa membantu orang lain di masa depan!

Hauke ​​P.
sumber
3
Berikut adalah petunjuk untuk proses yang sama dengan versi VS yang lebih baru (hingga 2019): docs.microsoft.com/en-us/visualstudio/debugger/…
brichins
3

Jika tidak ada proses maka Visual Studio tidak dapat melampirkan .

Namun, Anda dapat mengatur program startup proyek Anda menjadi sesuatu selain output dari proyek Anda.

ChrisF
sumber
Saya sudah menyelidiki apakah yang ingin saya lakukan itu benar, dan memang benar. Situasi saya bukanlah kasus debugging Visual Studio biasa. Saya memiliki proyek template Excel 2010 yang dikembangkan dalam Visual Studio dan lembar template memiliki acara startup. Saya menjalankan template ini dari Visual Studio, menambahkan beberapa data di lembar Excel saya dan menyimpan file di disk. Maka satu-satunya cara saya dapat membuka file ini yang juga mengandalkan perakitan template, adalah membukanya dari explorer, oleh karena itu saya tidak dapat men-debug acara startup dalam hal ini dan tentu saja saya memiliki beberapa pemrosesan data saat startup seperti penyatuan data.
Ucodia
Anda mungkin perlu mencentang "Aktifkan proses debug kode native" (properti proyek → DebugAktifkan Debugger ).
Peter Mortensen
3

Anda dapat menampilkan MessageBox, ini akan memblokir aplikasi, lalu Anda melampirkan atau memasang kembali debugger ke proses dan klik ok untuk melanjutkan:

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

Anda dapat menambahkannya ke konstruktor Formulir (jika Anda menggunakan winforms), jadi ini akan dijalankan sebelum yang lain, kecuali untuk inisialisasi komponen:

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

Ketika Anda menyelesaikan debugging, komentari baris itu.

Raynet
sumber
3

Anda dapat memulai debugger dari kode Anda melalui

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

Tapi jangan sampai menghapus baris ini sebelum mengirimkan aplikasi Anda. Mungkin Anda ingin menggunakan flag compiler untuk memastikan:

    public static void Main(string[] args)
    {
      #if debug
      System.Diagnostics.Debugger.Launch();
      #endif
    }
Seseorang
sumber
2
Ini harus menjadi jawaban yang diterima untuk semua kasus di mana Anda menunggu beberapa proses eksternal untuk meluncurkan aplikasi Anda.
TravelingFox
2

Satu solusi kecil yang mungkin cocok untuk banyak orang.

  • di baris pertama kode yang akan dijalankan exe, tambahkan perintah ini

    System.Threading.Thread.Sleep (20000)

Itu akan membuat exe tidur selama 20 detik sebelum mulai memproses apa pun. Kemudian Anda memiliki waktu 20 detik untuk melampirkan proses, yang dapat dilakukan dengan cepat dengan ctrl + alt + p, lalu temukan prosesnya, lalu masukkan untuk melampirkan.

Tidak banyak jawaban tetapi berhasil untuk saya: -)

pengguna2728841
sumber
Saya harus men-debug CGI yang ditulis dalam "C" yang kode sumbernya saya miliki. Saya adalah solusi sederhana dan mudah untuk memiliki waktu untuk melampirkan proses latar belakang.
Joël Hecht