Как игнорировать прерывания с помощью arm gdb

Я пытаюсь отлаживать программу с помощью arm-none-eabi-gdb и выполнять ее. Существует прерывание USB0_Handler, в которое я не хочу вмешиваться при выполнении программы. Для этого я попытался использовать skip, но это не сработало, даже если я попытаюсь пропустить функцию или пропустить весь файл (содержащий прерывание). Я использую openocd для удаленной отладки на tm4c123gh6pm.

Я достиг точки, когда я не знаю, должен ли я определить для себя функцию gdb или я что-то упускаю. Вот вывод моего терминала:

(gdb) info skip
Num     Type           Enb What
1       function       y   USB0_Handler
(gdb) c
Continuing.

Breakpoint 2, relayTask () at ./relay.c:191
191         nextTime = rtcGetTimeIn(DEFAULT_REFRESH_RATE);
(gdb) n
USB0_Handler () at ./UsbConfig.c:326
326 {
(gdb) n
332     ui32Status = MAP_USBIntStatusControl(USB0_BASE);
(gdb) n
337     USBDeviceIntHandlerInternal(0, ui32Status);
(gdb) n
338 }
(gdb) n  #returning at the top of USB0_Handler
326 {

person adriel    schedule 07.06.2016    source источник
comment
Вы не вступаете в обработчик, но это происходит во время выполнения кода.   -  person too honest for this site    schedule 07.06.2016
comment
Вы можете попробовать команду finish, чтобы выйти из обработчика прерывания.   -  person markgz    schedule 07.06.2016
comment
Я не уверен, что у gdb есть хороший способ сделать это. Если в UsbConfig.c нет ничего, что вам нужно отладить, возможно, одним из обходных путей будет убедиться, что он скомпилирован без отладочной информации (т. е. без -g в командной строке компилятора).   -  person kaylum    schedule 07.06.2016
comment
команда finish на самом деле не работала. Недавно я изменил свой Makefile, чтобы добавить конкретное правило для UsbConfig.c (без -g или -ggdb), но я все еще попадаю в USB0_Handler во время отладки (с новой сборкой)   -  person adriel    schedule 07.06.2016


Ответы (1)


Когда во время пошагового выполнения срабатывает прерывание, GDB обычно останавливается, потому что шаг закончился в неожиданном месте.

С обработчиками прерываний, как правило, трудно иметь дело с точки зрения отладчика, потому что они выполняются в новом контексте: кадры стека изменяются, и если GDB не распознает определенный шаблон во фрейме, он не сможет вычислить полную трассировку стека. (т.е. кадры обработчика прерывания + ваша обычная трассировка стека программы перед прерыванием.)

Самый простой способ выйти из обработчика прерывания — установить точку останова на последней строке функции, возобновить выполнение и продолжить пошаговое выполнение. Кто-то предложил использовать команду Finish, но это может привести к сбою в зависимости от качества трассировки стека.

Благодаря возможности сценариев GDB (например, в python) можно автоматизировать это, проверяя ПК и, если ПК находится на адресе isr в векторе irq, извлекая адрес возврата, устанавливая временную точку останова и возобновляя работу.

person Christophe Augier    schedule 24.08.2016