Как подключить отладчик VC ++ (или GDB) в этой ситуации? - PullRequest
1 голос
/ 04 февраля 2010

Я использую типичный процесс производителя и потребителя, но они выполняются с использованием pipe в командной строке, как показано ниже:

c:\>producer | consumer

producer просто распечатывает данные в stdout, а consumer читает из stdin.

Моя проблема в том, что я хочу отладить consumer процесс. Каков наилучший способ сделать это в VC ++ и GDB?

Одним из решений является выгрузка в файл и чтение файла:

c:\>producer > temp.data
c:\>consumer < temp.data

Однако объем данных, передаваемых этими двумя, чрезвычайно велик. temp.data будет больше, чем 1 ТБ! Я могу использовать сжатие, но для сжатия / распаковки требуется огромное количество времени. Итак, я хочу сделать это онлайн.

Текущий мой обходной путь:

  1. Перед выполнением какой-либо работы, например чтения с stdin.
  2. Вызовите producer | consumer из консоли. Затем consumer запускается с 10-секундным сном.
  3. Присоедините consumer процесс с помощью VC ++ и GDB за 10 секунд.
  4. Хорошо, после сна я могу теперь отладить потребителя.

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

1 Ответ

2 голосов
/ 05 февраля 2010

На ум приходят два решения

Измените свой сон на

// this waits indefinitely without killing the CPU
while(true) {SleepEx(100, FALSE);} 

После того, как вы прикрепите отладчика вручную, вы просто ставите точку останова на сон, а затем можете вручную выпрыгнуть из цикла.

или еще лучше (если это не служба / процесс без доступа к пользовательскому интерфейсу), добавьте оператор DebugBreak , где вместо этого находится Sleep. Это приведет к возникновению исключения, и вам будет предложено завершить процесс или отладить запуск стандартного отладчика в системе.

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