Как отладить внешнюю программу, запущенную из .bat, а не из .exe в VS2005? - PullRequest
4 голосов
/ 13 января 2010

В свойствах отладки моего проекта на c # я выбрал Start External Program и выбрал .exe программы, к которой я хочу присоединить отладчик. Однако теперь мне нужно запустить программу из файла .bat, а не .exe, но VS2005, похоже, не позволяет этого. Возможно ли это?

РЕДАКТИРОВАТЬ: Чтобы уточнить, мне нужно отладить .exe, который появляется из .bat. Не отлаживать .exe, запускаемый из «запуска внешней программы», а также запускать .bat.

Ура! * * 1005

Ответы [ 5 ]

3 голосов
/ 13 января 2010

Если вы не возражаете против перекомпиляции приложения каждый раз, когда вам нужно отладить, вы можете вызвать временный вызов System.Diagnostics.Debugger.Break () при запуске. Это вызовет диалоговое окно отладки точно в срок и позволит вам присоединиться в момент, когда вызывается Debugger.Break ().

Вы также можете включить отладку JIT для исполняемого файла с заданным именем, используя инструмент "Global Flags" / gflags. С этой опцией нет необходимости изменять исходный код или перекомпилировать.

  • Загрузите средства отладки для Windows здесь: http://www.microsoft.com/whdc/Devtools/Debugging/default.mspx

  • Запустите gflags.exe в C: \ Program Files \ Средства отладки для Windows \ gflags.exe

  • Выберите вкладку файла изображения

  • Введите имя вашего exe, например, myapplication.exe вверху и нажмите вкладку

  • Выберите отладчик в нижней части и введите vsjitdebugger.exe

Пока этот флаг установлен, вам будет предложено отлаживать приложение при каждом его запуске.

Еще один вариант - добавить переключатель командной строки в ваше приложение и командный файл (например, / break) и вызывать Debugger.Break () только при его передаче. Это избавляет от необходимости перекомпилировать, когда вы решаете отлаживать, а также избавляет от необходимости каждый раз проверять опцию отладчика в gflags.

Очевидные преимущества этих подходов в том, что они устраняют любые расы между тем, когда приложение запускается и когда вы можете присоединиться.

2 голосов
/ 13 января 2010

Предполагая, что другого простого ответа нет, вы можете использовать макрос для запуска и присоединения к процессу. В проекте макроса Samples есть пример макроса, который устанавливается вместе с Visual Studio, но я вставил соответствующий фрагмент ниже. Если у вас есть макрос для выполнения командного файла, сделайте небольшую паузу, затем присоединитесь к процессу - вы можете добавить макрос на панель инструментов Visual Studio, чтобы запустить его одним щелчком мыши.

' Lifted from Samples.vsmacros '
' VSDebugger.AttachToCalc '
Sub AttachToCalc()
    Dim attached As Boolean = False
    Dim proc As EnvDTE.Process

    For Each proc In DTE.Debugger.LocalProcesses
        If (Right(proc.Name, 8) = "calc.exe") Then
            proc.Attach()
            attached = True
            Exit For
        End If
    Next

    If attached = False Then
        MsgBox("calc.exe is not running")
    End If

End Sub
0 голосов
/ 20 января 2010

Я бы предложил использовать System.Diagnostics.Debugger.Launch(), заключенный во что-то условное, чтобы не вызывать его вне ситуации отладки. Вы получите диалоговое окно с вопросом, какой отладчик использовать. Если у вас загружен проект, в отображаемом диалоговом окне появится etry, позволяющий вам использовать уже запущенный экземпляр VS.

0 голосов
/ 13 января 2010

Я бы предложил выделить факторы, связанные с необходимостью командного файла для запуска вашей программы. Я никогда не сталкивался с ситуацией, когда я не мог отладить исполняемый файл, указав всю информацию в разделе отладки конфигурации проекта.

При создании exe-объекта для отладки необходимо помнить три вещи:

  1. Путь к исполняемому файлу. Это должен быть полный путь. Если исполняемый файл выводится вашим проектом, вы можете использовать макросы VS, например $(OutDir), чтобы указать его.

  2. Параметры командной строки. Они идут в отдельном текстовом поле, а не в том же, что и путь к exe.

  3. Рабочий каталог. Это каталог, из которого запускается исполняемый файл. Некоторые программы могут быть чувствительны к этому. По умолчанию для проекта C # используется выходной каталог из памяти.

Если есть необходимость запускать пакетный файл каждый раз, когда вы отлаживаете, вы можете попробовать отредактировать его, чтобы он не вызывал исполняемый файл и запускал этот пакетный файл как шаг после сборки.

0 голосов
/ 13 января 2010

Единственный способ отладки EXE-файла, который вы не запускаете напрямую, - это присоединить отладчик к уже запущенному процессу. Это требует, чтобы у вас было достаточно времени, чтобы присоединиться к процессу, и это не всегда так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...