Команды GDB Monitor в CLion
Я пытаюсь отладить встроенный проект с помощью удаленного GDB. Моя система:
- Цель: ARM Cortex M0.
- Версия командной строки SEGGER J-Link GDB Server V6.10
- arm-none-eabi-gdb 7.10.1.20160616-cvs
- CLion 2016.2.2, сборка № CL-162.1967.7
- Ubuntu 16.04
В моем файле.gdbinit есть следующее:
target remote localhost:2331 #(I remove this line when debugging with CLion)
set verbose on
file "/path_to_output_file/blinky.elf"
monitor reset
break main
То, что беспокоило меня уже несколько дней, это то, что это работает нормально, если я отлаживаю с помощью gdb непосредственно из терминала, но не когда использую отладчик в CLion. В CLion я получаю ошибку:
Команда "монитор" не поддерживается этой целью.
Моя теория заключается в том, что терминал принимает команду "сброс монитора" (по крайней мере, он не жалуется). CLion, с другой стороны, печатает сообщение об ошибке, но, как представляется, впоследствии продолжает работу без сброса. Следствием этого является то, что когда я начинаю новый сеанс отладки в CLion, я не начинаю с начала main().
CLion блокирует команды монитора? Если так, то почему и есть ли обходной путь?
У меня такое чувство, что мои вопросы могут быть связаны с CPP-7322 и CPP-7256.
2 ответа
CLion не блокирует какую-либо конкретную команду от .gdbinit
нарочно. Дело в том, что эти команды выполняются при запуске отладчика перед подключением к цели. Это означает, что monitor reset
Команда выполняется без запуска удаленного сеанса, следовательно, она не выполняется.
Просто для ясности:
вот что происходит, когда вы выполняете GDB вручную:
# commands from .gdbinit target remote localhost:2331 set verbose on file "/path_to_output_file/blinky.elf" monitor reset break main
вот что происходит, когда вы выполняете GDB из CLion с тем же
.gdbinit
файл:# commands from .gdbinit target remote localhost:2331 set verbose on file "/path_to_output_file/blinky.elf" monitor reset break main # commands executed by CLion to attach target remote localhost:2331 # <- ERROR (A program is being debugged already)
и вот что происходит, когда вы выполняете GDB из CLion с удаленной командой присоединения:
# commands from .gdbinit set verbose on file "/path_to_output_file/blinky.elf" monitor reset # <- ERROR not attached to remote gdbserver => unknown command # ... not executed due to the error above break main # commands executed by CLion to attach target remote localhost:2331
Связанные с вами проблемы совершенно правильные, пожалуйста, не стесняйтесь голосовать (отказ от ответственности: я один из разработчиков CLion). Боюсь, я не мог найти разумного обходного пути, чтобы предложить вам сейчас.
Обновить:
На самом деле есть обходной путь для вашего варианта использования, который работает как для сеансов отладки CLion, так и для терминала. Вы можете использовать GDB-хуки для достижения этой цели.
В вашем .gdbinit
file замените эти команды следующими строками:
define target hookpost-remote
file "/path_to_output_file/blinky.elf"
monitor reset
break main
end
Таким образом, каждый раз, когда удаленная цель подключается, GDB будет выполнять команды, указанные в определенном хуке, независимо от того, как вы запускаете отладчик, либо из CLion, либо из терминала.
Оглядываясь на ту же проблему, я наткнулся на этот проект GitHub, в котором есть отличное пошаговое руководство по настройке отладчика JLink на CLion. Что действительно помогло мне это сценарий, который генерирует .gdbinit
в домашнем каталоге пользователя.
Нет необходимости добавлять file /firmware.elf
команда, как это заботится CLion, когда запущен сеанс отладки. С другой стороны, load
Команда необходима, чтобы прошить вашу цель.