2015-07-17 2 views
0

Я пытаюсь удаленно отлаживать приложение с помощью командной строки GDB. Путь, в котором gdb запущен на ПК, - это путь сборки приложения. Он содержит amixer исполняемый файл и amixer.c.Удаленная отладка GDB - не может подключиться к исходному файлу, но ошибки не печатаются

Код составлен с параметрами -g -O2.

отладочной, кажется, присутствуют:

$ readelf -WS amixer 
There are 38 section headers, starting at offset 0x1d24c: 
... 
    [27] .debug_aranges PROGBITS  00000000 00a758 000140 00  0 0 8 
    [28] .debug_info  PROGBITS  00000000 00a898 008c59 00  0 0 1 
    [29] .debug_abbrev  PROGBITS  00000000 0134f1 00085a 00  0 0 1 
    [30] .debug_line  PROGBITS  00000000 013d4b 001a8c 00  0 0 1 
    [31] .debug_frame  PROGBITS  00000000 0157d8 000494 00  0 0 4 
    [32] .debug_str  PROGBITS  00000000 015c6c 001f75 01 MS 0 0 1 
    [33] .debug_loc  PROGBITS  00000000 017be1 004dff 00  0 0 1 
    [34] .debug_ranges  PROGBITS  00000000 01c9e0 000700 00  0 0 1 

шаги на удаленном устройстве (раздели бинарной):

gdbserver 192.16.6.21:12345 amixer 

шаги на ПК (двоичная здесь не удалялись):

$ gdb amixer 
(gdb) set sysroot /correct/path/to/remote/device/sysroot 
(gdb) target remote 192.16.6.12:12345 
(gdb) break main 
Breakpoint 1 at 0x11f58 
(gdb) list main 
(gdb) show directories 
Source directories searched: $cdir:$cwd 
(gdb) continues 
...program executes on remote device... 

Предположения, которые я сделал:

  • break main не выдает ошибки, поэтому доступны исполняемые символы отладки. Я бы ожидал увидеть исходный файл, упомянутый здесь уже. Как и в example: Breakpoint 1 at 0x62f4: file builtin.c, line 879.
  • есть на выходе readelf -WS amixer.debug* так отладочные символы присутствуют
  • list main не перечисляет источник основной функции. Что-то не так

  • show directories список $cdir и $cwd Я предполагаю, по крайней мере, из них каталог, из которого я начал gdb amixer и это каталог для сборки с обеих исполняемых файлов и источников

Я, очевидно, что-то не так, поэтому я ищу обзор предположений и советов по отладке.

+0

Есть ли 'addr2line -a 0x11f58 -e/correct/path/to/amixer-with-debug-info' показывает имя файла и номер строки? –

ответ

1

break main не выдает ошибки, поэтому доступны исполняемые символы отладки.

Вы ошибаетесь: тот факт, что break main не показывает каких-либо ошибок, делает не означает, что символы отладки доступны. Остальная часть вашего вывода соответствует отладочным символам , а не.

Итак, ваш первый шаг должен состоять в том, чтобы подтвердить, что символы отладки действительно присутствуют. Если readelf -WS amixer не показывает никаких разделов .debug_* или .zdebug_*, это будет доказательством отсутствия информации об отладочной информации. Если это так, повторите проверку команд командной строки для наличия флага -g на линиях компиляции и отсутствии -Wl,-s или аналогичного флага на линии ссылки.

+0

Что означает '0x62f4' в' Breakpoint 1 на 0x62f4'? Я считал, что это место памяти для «main», и потому что оно доступно, что означает, что доступны символы отладки. – TheMeaningfulEngineer

+0

@Alan Как я уже сказал, ваш двоичный * имеет * символы, но не * отладочные символы *. Это не одно и то же (см. Также комментарий Марка Плотника). –

+0

Обновленный вопрос с новыми идеями, символы отладки действительно доступны. Изучение возможных проблем, вызванных оптимизацией флага '02'. Не совсем уверен, почему он по умолчанию будет использовать как '-02', так и' -g', если оптимизация заставит отладку прекратить работу. – TheMeaningfulEngineer