Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
TamaGOch
9 / 9 / 0
Регистрация: 11.12.2012
Сообщений: 152
#1

Отладка порожденного процесса - C++

25.06.2013, 22:51. Просмотров 750. Ответов 9
Метки нет (Все метки)

Очень сильно не хватает эрудированности по этой теме. Делаю вот так:
Пытаюсь запустить CreateProcess'ом процесс, процесс запускается, лезу в Attach to Process и, к сожалению, вижу порождённый процесс, но серого цвета, не могу его выделить (т.е. выделить могу, не могу подтвердить).

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

на msdn пишется что-то про DebuggableAttribute
а, да, и при этом я в параметре dwCreationFlags указываю DEBUG_PROCESS, иначе процесс вылетает, для этого и нужна отладка, найти и исправить место вылетания
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.06.2013, 22:51
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Отладка порожденного процесса (C++):

Отладка процесса на удаленной машине - C++
Подскажите, пожалуйста, в общих чертах, как можно сделать собственный отладчик, который позволит отлаживать процессы на других машинах. С...

Вызов конструктора базового класса из порожденного - C++
Есть Базовый класс студент: имеет поля: фамилия, адрес, тел., возраст. Порожденный класс группа: имя группы, кол-во студентов в...

Библиотеки процесса, защита от изменения процесса - C++
Здраствуйте. 1) Как можно получить список библиотек (dll, asi), которые уже загружены в процесс какой-то программы? Мне нужно чекать...

Отладка - C++
Всем доброго времени суток! Я новичок на этот форуме, да и вообще в программировании. Я начал заниматься написанием плагинов на С++...

Отладка :) - C++
Доброго времени суток. Подскажите пожалуйста! Делаю отладку в Visual Studio. Хочу чтобы выполнилось условие if. Какое сочетание клавиш...

Отладка - C++
Помогите отладить программу - не могу понять, почему завершается работа. Вот код: #include <iostream> #include <windows.h> ...

9
DU
1484 / 1130 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
25.06.2013, 23:13 #2
если он серый, то возможно уже приаттачен. брекйпоинты в коде этого процесса стоят?
0
TamaGOch
9 / 9 / 0
Регистрация: 11.12.2012
Сообщений: 152
25.06.2013, 23:19  [ТС] #3
DU, в общем я сделал по-другому: самой первой строкой поставил sustem ("pause"), теперь приаттачил, а вот что дальше делать, не знаю, а именно, как ориентировать в том, что я открыл. Там должны появиться исходники дочернего процесса или что-то другое?
п.с. после переключения процесса в левом верхнем углу на дочений
в коде то стоят, вот только я не знаю, как до них добираться
0
DU
1484 / 1130 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
25.06.2013, 23:24 #4
если у вас есть код, из которого скомпилился дочерний процесс, то проставив в нем бряки, студия должна на них останавливаться (это в случае, если она сразу аттачится к такому дочернему процессу). если она сразу этого не делаем, то я знаю только пару трюков:
1. поставить сразу после мейна функцию засыпания на какое-то время успеть приаттачится к нему, пока он не проснулся.
2. более простой. поставить сразу после мейна assert(!"Attach now"); что приведет к появлению диаложка с срабатыванием ассерта. пока этот диаложик не закрыт, аттачимся к процессу и после игнорим этот ассерт, после игнора выполняется весь остальной код уже приаттаченного к дебагеру процесса.

Если у вас нет кода этого дочернего процесса, то нафига вы к нему аттачитесь? по дизассемблеру собрались бегать или для чего?
1
TamaGOch
9 / 9 / 0
Регистрация: 11.12.2012
Сообщений: 152
25.06.2013, 23:31  [ТС] #5
опа, вот оно как:
Windows has triggered a breakpoint in Algo_Battle.exe.

This may be due to a corruption of the heap, which indicates a bug in Algo_Battle.exe or any of the DLLs it has loaded.

This may also be due to the user pressing F12 while Algo_Battle.exe has focus.

The output window may have more diagnostic information.

где-то я сегодня уже видел ответ на этот вопрос, но потерял, придётся поискать заново

Добавлено через 6 минут
DU не не, я по своему процессу пробегаю, исходники есть. Мне надо их положить в ту же директорию, что и сам exe-шник?
0
DU
1484 / 1130 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
25.06.2013, 23:35 #6
нет. студии для отладки нужен pdb файл. в нем дебажная инфа. она связывает исходники и бинарный код.
как-то я никогда не заморачивался этим, студия сама знала где что лежит. в случае, когда она не знает,
то в колл стеке тыкаем правой мышкой на модуле, для которого студия не нашла символы (они серые там),
и смотрим всякие кнопочки на тему загрузки символов. т.к. нужда в этом возникает у меня достаточно редко,
детали я расписать не могу.
1
TamaGOch
9 / 9 / 0
Регистрация: 11.12.2012
Сообщений: 152
25.06.2013, 23:56  [ТС] #7
DU, надеюсь я не сильно замучил своими вопросами, просто интересно. Дало теперь такое: я аттачусь, переключаюсь на дочерний процесс, далее открывается это:
Отладка порожденного процесса
тут не видно, но справа написано, что вроде как всё нормально, Symbols loaded, вот только как попасть на брекпоинт дочернего процесса, не знаю, что при этом надо нажимать?

Добавлено через 6 минут
Сейчас пытаюсь так: жму на F5, консоль открывается и, вроде бы, как раз на дочернем system ("pause"). вот, потом я аттачу дочерний процесс и в окне Output появляется строка
The thread 'Win32 Thread' (0x684) has exited with code 0 (0x0).
0
DU
1484 / 1130 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
26.06.2013, 00:04 #8
мне не совсем понятно что у вас там происходит. попробуем в псевдокоде:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// parent.cpp файл родительского процесса:
int main()
{
   StartChildProcess();
   return 0;
}
 
 
// child.cpp файл дочернего процесса:
int main()
{
   assert(!"Attach now.");
   std::cout << "hello from child." << std::endl;  // вот тут бряку ставте.
   return 0;
}
открываете проект родительского процесса в студии. в ней же открываете файл child.cpp (не важно где он лежит, нужно открыть в контексте родительского солюшена) и ставите бряку в указанном месте. Ассерт нужен на случай, если студия автоматом не аттачит к себе этот дочерний процесс. Нажимаете F5 для старта дебага родительского процесса. Он сразу запускает дочерний и если студия его не приаттачила сама, то пока будет висеть ассертное окно, код дочернего процесса выполнятся не будет. Т.е. к нему можно приаттачится и заигнорить этот ассерт. После аттача и игнора студия должна встать в указанной бряке. Если это не так, то
я не знаю как через форум вам наладить отладку.
0
TamaGOch
9 / 9 / 0
Регистрация: 11.12.2012
Сообщений: 152
26.06.2013, 00:12  [ТС] #9
аа, стоп, я похоже пытался аттачиться к процессу, который скомпилировал не в отладочном режиме

Добавлено через 7 минут
DU, спасибо за пример, попробую его отладить с нуля, а не тащить свои исходники, приношу глубочайшие извинения за уделённое время и выражаю огромнейшую благодарность!
0
DU
1484 / 1130 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
26.06.2013, 00:17 #10
с ассертом я наглючил. с ним не работает. ни игнор, ни ретрай. поэтому выводим обычное окно сообщения для аттача. студия сама не аттачит. вот два файла двух обычных консольных проектов. один родительский, другой дочерний.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// это родительский
#include <stdafx.h>
 
#include <string>
#include <limits>
#include <iostream>
 
int main()
{
  system("d:\\Projects\\msvs2012\\testik2\\Debug\\testik2.exe");
  return 0;
}
 
 
// а это дочерний
#include "stdafx.h"
 
#include <windows.h>
#include <cassert>
#include <iostream>
 
int main()
{
  MessageBoxA(NULL, "Attach now", NULL, MB_OK);
  std::cout << "hello from child." << std::endl; // тут бряка.
  return 0;
}
Дочерний и родительский проекты собраны.
После старта родительского из студии по F5, он запускает дочерний (появляется MessageBox). Не закрываем его, а аттачимся студией к дочернему процессу. Открываем в студии, из которой запущен родительский процесс файлик дочернего и ставим после MessageBox бряку. После этого закрываем мессаджбокс и студия останавливается в установленной бряке.
0
26.06.2013, 00:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.06.2013, 00:17
Привет! Вот еще темы с ответами:

Отладка - C++
Доброго времени суток! Написал программку в которой специально допустил ошибку. int main() { char * buf = nullptr; ...

Отладка - C++
Нужно добавлять элемент в массив array (вводится с клавиатуры), если его не существует. Функция Add: void Set::add() { int a;...

Отладка - C++
РЕбят, подскажите как сделать чтоб выводило только 4 знака после запятой у X и Y. Заранее спасибо#include&lt;math.h&gt; #include&lt;stdio.h&gt; ...

Отладка - C++
Вопрос такой, можно ли в visual studio сделать остановку ( только с помощью отладчика ), на определённом шаге цикла, то есть while на 100...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru