WedX - журнал о программировании и компьютерных науках

Используйте GDB для отладки программы C++, вызванной из сценария оболочки

У меня есть чрезвычайно сложный сценарий оболочки, в котором он вызывает программу на C++, которую я хочу отладить через GDB. Чрезвычайно сложно отделить эту программу на С++ от оболочки, так как она имеет множество ветвей и множество настроек переменных окружения.

Есть ли способ вызвать GDB в этом сценарии оболочки? Похоже, gdb требует, чтобы я вызывал программу на C++ напрямую.

19.02.2011

  • Блин... Та же проблема до сих пор существует. Я думаю, что простой set follow-fork-mode child будет всем, что нам нужно сделать, чтобы добраться до интересующего нас кода... 10.11.2017

Ответы:


1

Есть два варианта, которые вы можете сделать:

  1. Вызывайте GDB непосредственно из сценария оболочки. Это будет означать, что у вас нет стандартного перенаправления входа и выхода.

  2. Запустите сценарий оболочки, а затем подключите отладчик к уже запущенному процессу C++ следующим образом: gdb progname 1234, где 1234 — это идентификатор запущенного процесса C++.

Если вам нужно что-то сделать до того, как программа запустится, то вариант 1 будет лучшим выбором, в противном случае вариант 2 будет более чистым.

19.02.2011

2

В дополнение к вариантам, упомянутым @diverscuba23, вы можете сделать следующее:

gdb --args bash <script>

(при условии, что это скрипт bash. В противном случае адаптируйтесь соответственно)

28.08.2015
  • gdb начинается с вышеуказанного метода, но я не могу ничего сделать, например, установить точку останова, поскольку он говорит, что таблица символов не найдена. Как это решить? 02.05.2018
  • Итак, какую команду вы вводите из терминала для запуска вашего кода с помощью gdb? Если он говорит, что таблица символов не найдена, это может просто означать, что вам нужно создать свой код с символами отладки, а не 03.05.2018

  • 3

    Я бы, вероятно, изменил сценарий, чтобы он всегда вызывал gdb (и возвращал это позже), или добавлял бы опцию для вызова gdb. Это почти всегда будет самым простым решением.

    Следующим самым простым было бы временно переместить ваш исполняемый файл и заменить его сценарием оболочки, который запускает gdb в перемещенной программе. Например, в каталоге, содержащем вашу программу:

    $ mv program _program
    $ (echo "#!/bin/sh"; echo "exec gdb $PWD/_program") > program
    $ chmod +x program
    
    19.02.2011

    4

    Измените приложение C++, чтобы оно распечатало его pid и заснуло на 30 секунд (возможно, в зависимости от среды или аргумента). Присоединитесь к работающему экземпляру с помощью gdb.

    19.02.2011
  • спать 30 секунд или лучше ждать нажатия клавиши. 08.09.2020

  • 5

    Не могли бы вы просто временно добавить gdb в свой сценарий?

    19.02.2011

    6

    Хотя приведенные ответы действительны, иногда у вас нет прав на изменение сценария для выполнения gdb или на изменение программы для добавления дополнительных выходных данных для подключения через pid.

    К счастью, есть еще один способ использовать силу bash.

    Используйте ps, grep и awk, чтобы выбрать pid для вас после его выполнения. Вы можете сделать это, обернув другой скрипт своим собственным или просто выполнив команду самостоятельно.


    Эта команда может выглядеть примерно так:

    процесс.ш

    #!/usr/bin/env bash
    
    #setup for this example
    #this will execute vim (with cmdline options) as a child to bash
    #we will attempt to attach to this process
    vim ~/.vimrc
    

    Чтобы подключить gdb, нам просто нужно выполнить следующее:

    gdb --pid $(ps -ef | grep -ve grep | grep vim | awk '{print $2}')

    1. Здесь я использую ps -ef, чтобы перечислить процессы и их аргументы. Иногда у вас будет несколько запущенных экземпляров программы, и вам нужно будет выполнить дальнейший поиск до того, который вы хотите.
    2. grep -ve grep здесь, потому что опция f для ps будет включать следующий grep в свой список. Если вам не нужны аргументы команды для дополнительной фильтрации, не включайте параметр -f для ps и игнорируйте эту часть.
    3. grep vim — это место, где мы находим желаемый процесс. Если вам нужна дополнительная фильтрация, вы можете просто сделать что-то вроде grep -E "vim.*vimrc" и отфильтровать именно тот процесс, к которому вы пытаетесь подключиться.
    4. awk '{print $2}' просто выводит только pid процесса на стандартный вывод. Используйте $1, если вы используете ps -e вместо ps -ef

    Моя обычная установка - запустить такой скрипт, который запускает мой процесс в 1 панели tmux и набирает что-то похожее на приведенное выше в нижней панели. Таким образом, если мне нужно настроить фильтрацию (по какой-либо причине), я могу сделать это довольно быстро.


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

    runGdb.py

    #!/usr/bin/env bash
    
    ./process.sh &
    
    PID=$(ps -ef  | grep -ve grep | grep -E "vim.*vimrc" | awk '{print $2}')
    #or
    #PID=$(ps -e | grep vim | awk '{print $1}')
    
    gdb --pid $PID
    

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

    25.06.2020
    Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

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


    Для любых предложений по сайту: [email protected]