Как заставить GDB следовать execv? Не работает, несмотря на "follow-exec-mode"
Я написал две простые программы:
int main(int ac, char **argv ) {
execv( "/home/me/Desktop/execvtest2", argv );
}
а также
int main(int ac, char **argv ) {
execv( "/home/me/Desktop/execvtest1", argv );
}
Я скомпилировал их с помощью gcc -g для соответствующих выходных файлов. Я использую Ubuntu 10.10 с помощью gcc (Ubuntu/Linaro 4.4.4-14ubuntu5.1) 4.4.5.
Когда я отлаживаю первую программу с помощью GNU gdb (GDB) 7.2-ubuntu, я могу перейти к первому утверждению execv, но затем эти два файла просто продолжают работать. Даже если я установлю для follow-exec-mode новое значение, я не смогу перейти ко второй программе. Когда я устанавливаю catch exec, gdb останавливается при каждом вызове execv (что-то вроде без связанного источника для второй программы, и я не могу выйти из gdb, так как он зависает!?), но я не могу перешагните вызов в "новую" (так как exec заменяет процесс) подчиненную программу.
Так как это можно сделать? Должен быть способ вступить в новый процесс, верно? Я делаю что-то неправильно?
ура
2 ответа
Вы можете использовать команду "catch". это даст вам шанс поставить некоторые точки останова после того, как вы исполни
Я делал что-то очень похожее на то, что вы делаете для одного из моих занятий. Это немного хакерски, и если вы пытаетесь получить такие значения, как значения регистра, это может испортить ситуацию. Согласно документации GDB, вы можете изменить файл символов, сохраняя при этом файл исполнения. Для этого просто используйте команду symbol-file file2
, Обратите внимание, что это должен быть двоичный файл, скомпилированный с флагом GDB (-g в GCC). После того, как вы загрузили этот файл символов, вы не сможете разорвать или увидеть какие-либо строки исходного файла выполнения. Однако вы можете установить точки останова для нового файла символов, т.е. break file2.c:40
а затем пошаговое выполнение, как и раньше. Он немного хакерский и может не работать идеально, потому что вы по сути перехватываете выполнение нового процесса и отображаете его в таблицу символов своего двоичного файла, не используя этот двоичный файл для непосредственного запуска. У меня не было звездных результатов, но вы можете увидеть промежуточные значения таким образом. Другое дело, чтобы вернуться к отладке исходного файла, вам придется сделать symbol-file file
перезагрузить его таблицу символов.