Як підключити Visual Studio до процесу, який ще не запущений?


89

У мене є програма .NET, яку з деяких причин неможливо запустити з Visual Studio (файл Excel, створений із шаблонного проекту Excel 2010), для якої мені потрібно налагодити події запуску.

Якщо я хочу налагодити події, які виникають після ініціалізації програми, проблем немає. Я запускаю програму з провідника, приєдную процес до Visual Studio і додаю деякі точки зупинки в коді. Але тут мені потрібно поставити точки зупинки на стартових подіях. Мені потрібно вміти приєднувати процеси до Visual Studio, не залежно від PID, а від конкретного імені процесу або будь-якого іншого рішення, яке б працювало.

Звичайно, про додавання а Thread.Sleep(1000)в мої стартові події, щоб дати мені трохи часу для підключення процесу у Visual Studio, мова не може йти!

Відповіді:


97

Насправді ви можете; ви не прикріплюєтеся до нього, ви починаєте його. У властивостях проекту на вкладці Налагодження в текстовому полі "Команда" вкажіть шлях до програми, до якої потрібно додати.

Ви також можете ввести будь-які аргументи командного рядка для програми у полі "Аргументи команд":

введіть тут опис зображення

Переконайтеся, що для параметра «Вкласти» встановлено значення «Ні».


6
Хороше рішення, але лише зауважте, що натискання клавіші F5 у цьому випадку не працює. Натомість клацніть правою кнопкою миші відповідний проект і натисніть "Налагодження> Почати новий екземпляр" у контекстному меню.
Герман Кордес,

1
Щоб F5 працював, ваш проект повинен бути початковим проектом у вирішенні. Для цього в досліднику рішень клацніть правою кнопкою миші на проект і виберіть «Встановити як стартовий проект».
Тібі

1
Також якщо ваша програма має деякі зовнішні залежності, вам також потрібно змінити "Робочий каталог".
Приянк

Може знадобитися встановити прапорець "Увімкнути налагодження власного коду" (властивості проекту → НалагодженняУвімкнути налагоджувачі ).
Пітер Мортенсен,

І як це зробити для цілого рішення з 40 проектами?
Тоні Таннус,

23

Я налагоджував плагін C ++ у зовнішньому процесі, який аварійно завершив роботу, викинувши виняток під час запуску, і це прекрасно для мене спрацювало:

Додайте безкоштовне розширення Reattach для Visual Studio . Попросіть його приєднати до назви процесу перед його запуском. У ньому з’явиться модальне діалогове вікно із повідомленням, що він чекає запуску назви процесу.

Тепер запустіть процес, і відладчик Visual Studio негайно приєднається, вловлюючи винятки та вражаючи точки зупинку.


Тисячу разів так!
itlittlejohn

Я отримав глухий кут. Він вимагав авторизації адміністратора при запуску моєї цілі, і після введення pwd та перезапуску проти, Reattach не було. Лише vs без прав адміністратора містить Reattach.
Ерік

2
Не працює у мене. Він все ще кріпиться занадто пізно, після того, як аварія вже сталася. Здається, перевіряти наявні процеси раз на секунду, що абсолютно безглуздо для цієї програми.
РІВ

20

Виконайте такі дії, якщо у вас Visual Studio 2017-2019:

  1. Файл> Відкрити> Проект / Рішення
  2. Виберіть .exe
  3. Налагодження> Почати налагодження

Набагато простіше, ніж інші пропозиції: вам не потрібно возитися з властивостями проекту, і ніякі розширення не потрібні.


Але вам доведеться повідомити Visual Studio, де знаходяться символи налагодження, якщо він не знаходить їх автоматично
Matt Thomas

1
швидко, легко це можна зробити за 5 секунд, мені це подобається. Дякую
товаришу Joecool

1
Мій exe був запущений, але не вдалося встановити точку зупинки. Що я повинен зробити?
Ерік

2
@Eric Якщо мій коментар вище не стосується цього питання, я рекомендую поставити це як SO-питання замість коментаря. Ваша проблема стане більш помітною, і ви матимете можливість пояснити свій конкретний сценарій. Тоді повідомте нам, що ви знайшли!
Matt Thomas

11

Цю відповідь я знайшов, коли шукав щось подібне. У моєму випадку я не міг просто використати виконуваний файл як програму запуску мого проекту, оскільки його потрібно було запустити в дуже специфічному середовищі, яке я не міг легко відтворити (namly: розпочато з cygwin).

Я подивився Розширення Reattach, як запропонував mrstrange, а також дуже схожий Attach To Anything розширення ... але мій виконуваний файл, здавалося, закрився занадто швидко, щоб розширення могли повідомляти та приєднувати.

Нарешті мені допомогло це: https://stackoverflow.com/a/4042545/1560865 , де згадується стаття MSDN How to: Запустити налагоджувач автоматично , де в свою чергу перелічені наступні кроки:

  1. Запустіть редактор реєстру (regedit).
  2. У Редакторі реєстру відкрийте папку HKEY_LOCAL_MACHINE.
  3. Перейдіть до HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows NT \ currentversion \ image варіанти виконання файлу.
  4. У папці Параметри виконання файлу зображень знайдіть назву програми, яку потрібно налагодити, наприклад myapp.exe . Якщо ви не можете знайти програму, яку потрібно налагодити:
    a. Клацніть правою кнопкою миші папку Параметри виконання файлу зображення , а в контекстному меню натисніть Новий ключ .
    b. Клацніть правою кнопкою миші нову клавішу та в контекстному меню натисніть кнопку Перейменувати . c. Відредагуйте назву ключа до назви вашої програми; myapp.exe , у цьому прикладі.
  5. Клацніть правою кнопкою миші папку myapp.exe , а в контекстному меню натисніть Нове значення рядка .
  6. Клацніть правою кнопкою миші нове значення рядка та в контекстному меню натисніть кнопку Перейменувати.
  7. Змініть назву на debugger .
  8. Клацніть правою кнопкою миші нове значення рядка, а в контекстному меню натисніть Змінити . З'явиться діалогове вікно Редагування рядка .
  9. У полі Значення введіть vsjitdebugger.exe.
  10. Клацніть OK .
  11. У меню реєстру натисніть Вийти .
  12. Каталог, що містить vsjitdebugger.exe, повинен бути у вашому системному шляху. Щоб додати його до системного шляху, виконайте такі дії:
    a. Відкрийте Панель управління в класичному поданні та двічі клацніть Система .
    b. Клацніть Додаткові налаштування системи .
    c. У Властивостях системи перейдіть на вкладку Додатково .
    d. На вкладці Додатково натисніть Змінні середовища .
    e. У діалоговому вікні Змінні середовища в розділі Системні змінні виберіть Шлях , а потім натисніть кнопку Редагувати .
    f. У редагуванні змінної системидіалоговому вікні, додайте каталог у поле діалогове вікно системи. Вікно змінної величини . Використовуйте крапку з комою, щоб відокремити її від інших записів у списку.
    g. Натисніть OK, щоб закрити діалогове вікно Редагувати системну змінну .
    h. Натисніть OK, щоб закрити діалогове вікно Змінні середовища .
    i. Натисніть OK, щоб закрити Властивості системи
  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 і зберігаю файл на диску. Тоді єдиний спосіб, яким я можу відкрити цей файл, який також покладається на збірку шаблону, - це відкрити його з провідника, тому я не можу налагодити події запуску в цьому випадку, і, звичайно, я маю деяку обробку даних при запуску, як прив'язка даних.
Ucodia

Може знадобитися встановити прапорець "Увімкнути налагодження власного коду" (властивості проекту → НалагодженняУвімкнути налагоджувачі ).
Пітер Мортенсен,

3

Ви можете показати MessageBox, це заблокує програму, потім ви приєднаєте або повторно приєднаєте відладчик до процесу та натисніть кнопку OK, щоб продовжити:

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
Це має бути прийнятою відповіддю для всіх випадків, коли ви чекаєте на якийсь зовнішній процес для запуску вашої програми.
TravelingFox

2

Одне маленьке рішення, яке може підійти багатьом людям.

  • у перший рядок коду, який буде виконуватися exe, додайте цю команду

    System.Threading.Thread.Sleep (20000)

Це змусить exe спати протягом 20 секунд, перш ніж почати щось обробляти. Потім у вас є 20 секунд, щоб приєднатись до процесу, що можна швидко зробити за допомогою комбінації клавіш ctrl + alt + p, потім знайти процес, а потім увійти, щоб долучити.

Не багато відповіді, але для мене це пригостило: -)


Мені довелося налагодити CGI, написаний на "С", для якого я мав вихідний код. Я був простим і простим рішенням, щоб встигнути приєднатися до фонового процесу.
Джоель Гехт,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.