Команды 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 Команда необходима, чтобы прошить вашу цель.

Другие вопросы по тегам