Про gdb

Jtag отладчик очень полезен на первом этапе при тестировании новой железки, для поиска каких-либо аппаратных проблем. После того как станет понятно что железка работает корректно и нет аппаратных проблем, то можно приступить к отладке программного обеспечения.

Отладка программного обеспечения осуществляется с помощью программы отладчика - GNU Debugger и jtag отладчика.

Как правило GNU Debugger это часть кросс-компилятора. Например для платформы arm, она может называться arm-openwrt-linux-gdb.

Пример отладки u-boot c помощью отладчика arm-openwrt-linux-gdb и jtag peddi.

Запуск отладчика из командной строки:

$ arm-openwrt-linux-gdb u-boot
GNU gdb (Linaro GDB) 7.5-2012.09
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "--host=i686-linux-gnu --target=arm-openwrt-linux-uclibcgnueabi".
For bug reporting instructions, please see:
...
Reading symbols from /home/u-boot-1.1.4/u-boot...done.
(gdb) 

далее подключаемся к процессору через jtag peedi (192.168.1.1 - адрес peedi):

(gdb) target remote 192.168.1.1:2000
Remote debugging using 192.168.1.1:2000
0x00000bb0 in ?? ()

загружаем u-boot в оперативную память процессора:

(gdb) load
Loading section .text, size 0x50a18 lma 0x600000
Loading section .dummy, size 0x10 lma 0x650a18
Loading section .rodata, size 0xce9 lma 0x650a28
Loading section .rodata.str1.1, size 0xefac lma 0x651711
Loading section .reset_vector_sect, size 0x18c lma 0x670000
Loading section .data, size 0x315b lma 0x67018c
Loading section .u_boot_cmd, size 0x930 lma 0x6732e8
Start address 0x600000, load size 410324
Transfer rate: 367 KB/sec, 13677 bytes/write.

запускаем приложение:

(gdb) continue 
Continuing.

Инструменты для отладки.

добавление точки останова (breakpoint) по имени функции:

(gdb) break mv_set_power_scheme
Breakpoint 1 at 0x602774: file /home/u-boot-1.1.4/board/mv_feroceon/mv_kw/mv_main.c, line 1175.
(gdb) continue 
Continuing.

Breakpoint 1, mv_set_power_scheme () at /home/u-boot-1.1.4/board/mv_feroceon/mv_kw/mv_main.c:1175
1175		int mppGroupType1 = mvBoardMppGroupTypeGet(MV_BOARD_MPP_GROUP_1);

добавление точки останова (breakpoint) по номеру строки:

break mv_main.c:1249
Breakpoint 1 at 0x60295c: file /home/u-boot-1.1.4/board/mv_feroceon/mv_kw/mv_main.c, line 1249.
(gdb) continue 
Continuing.

Breakpoint 1, mv_set_power_scheme () at /home/u-boot-1.1.4/board/mv_feroceon/mv_kw/mv_main.c:1250
1250	}

добавление точки останова (breakpoint) по адресу:

b *0x00000090

информация о брекпоинтах:

(gdb) info break
Num     Type           Disp Enb Address    What
1       breakpoint     keep y   0x0060295c in mv_set_power_scheme 
                                           at /home/u-boot-1.1.4/board/mv_feroceon/mv_kw/mv_main.c:1249
	breakpoint already hit 1 time

удалить все брекпоинты:

(gdb) delete 
Delete all breakpoints? (y or n) y 

просмотр пути программы — бактрэйс:

(gdb) bt
#0  mvHddPowerCtrl () at /home/u-boot-1.1.4/board/mv_feroceon/mv_kw/mv_main.c:1328
#1  misc_init_r_env () at /home/u-boot-1.1.4/board/mv_feroceon/mv_kw/mv_main.c:807
#2  0x00603c44 in misc_init_r () at /home/u-boot-1.1.4/board/mv_feroceon/mv_kw/mv_main.c:881
#3  0x00623274 in start_armboot () at board.c:450
#4  0x00600064 in reset () at cpu/arm926ejs/start.S:202
#5  0x00600064 in reset () at cpu/arm926ejs/start.S:202

просмотр местоположения программного счетчика:

(gdb) x/i $pc
=> 0x6036b8 :	cmp	r9, #31

просмотр значений переменных(через слэш указывается формат):

(gdb) print hddPowerBit
$3 = 35
(gdb) print /x hddPowerBit
$4 = 0x23

пошаговое выполнение программы:

n ni s si

(gdb) n

отсоединиться от таргета:

detach

выход:

q