Как да игнорирам прекъсвания с 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 не разпознае конкретен модел в кадъра, той няма да може да изчисли пълно проследяване на стека (т.е. кадрите на манипулатора на прекъсване + проследяването на стека на обичайната ви програма преди прекъсването.)

Най-лесният начин да излезете от манипулатора на прекъсвания е да поставите точка на прекъсване на последния ред на функцията, да възобновите и да продължите да стъпвате. Някой предложи да се използва командата за завършване, но тя може да се провали в зависимост отново от качеството на трасирането на стека.

Благодарение на възможността за скриптове на GDB (например в python) може да е възможно да се автоматизира това чрез проверка на компютъра и ако компютърът е на isr адреса във вектора irq, извличане на адреса за връщане, поставяне на временна точка на прекъсване и възобновяване.

person Christophe Augier    schedule 24.08.2016