Как заставить 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 на новый, я не могу перейти во вторую программу. Когда я устанавливаю catch exec, gdb останавливается при каждом вызове execv (некоторые из них не связаны с исходным кодом для второй программы, и я не могу выйти из gdb, поскольку это вроде зависает !?), но я не могу перейдите по вызову в «новую» (как exec заменяет процесс) уступающую программу.

Итак, как это можно сделать? Должен быть способ вступить в новый процесс правильно? Я делаю что-то неправильно?

ура

вы можете использовать команду «catch». это даст вам возможность поместить некоторые точки останова после того, как вы выполните

Я делал что-то очень похожее на то, что вы делаете для одного из моих classов. Это немного хаки, и если вы пытаетесь получить такие вещи, как регистрационные значения, это может испортить вещи. Согласно документации GDB вы можете изменить файл символа, сохранив файл исполнения. Для этого просто используйте команду symbol-file file2 . Обратите внимание, что это должен быть двоичный файл, скомпилированный с флагом GDB (-g в GCC). После того, как вы загрузили этот файл символа, вы не сможете сломать или увидеть какие-либо строки исходного файла исполнения. Однако вы можете установить точки break file2.c:40 для нового файла символов, т. break file2.c:40 а затем выполнить выполнение так же, как и раньше. Это немного хакерский и может не работать отлично, потому что вы по существу захватываете выполнение нового процесса и сопоставляете его с таблицей символов его двоичного файла, не используя этот двоичный файл для его непосредственного запуска. У меня нет звездных результатов, но вы можете увидеть промежуточные значения таким образом. Другое дело, чтобы вернуться к отладке исходного файла, вам нужно будет сделать symbol-file file чтобы перезагрузить его таблицу символов.