Легкая отладка на встроенном Linux - PullRequest
5 голосов
/ 02 декабря 2009

Я занимаюсь разработкой приложения, которое работает на небольшом SBC на основе Linux (~ 32 МБ ОЗУ). К сожалению, мое приложение недавно стало слишком большим, чтобы работать под GDB. Кто-нибудь знает какие-либо хорошие, легкие методы отладки, которые я могу использовать во встроенном Linux? Даже возможность просмотра трассировки стека потока была бы чрезвычайно полезна.

Я должен упомянуть, что это приложение написано на C ++ и работает с несколькими потоками, поэтому gdbserver не требуется, поскольку он не работает с многопоточными приложениями.

Заранее спасибо,

Maha

Ответы [ 5 ]

4 голосов
/ 03 декабря 2009

gdbserver определенно работает с многопоточными приложениями, сейчас я работаю над встроенным проектом с> 25 потоками, и мы все время используем gdbserver.

info threads 

перечисляет все темы в системе

thread <thread number from info threads>  

переключается на этот поток выполнения.

thread apply XXX <command>  

Запускается в потоке, обозначенном XXX, который также может быть «all». Так что если вы хотите обратную трассировку от всех запущенных потоков, сделайте

thread apply all bt

Как только вы попадаете в поток выполнения заданных потоков, все ваши типичные команды работают так же, как в однопоточном процессе.

2 голосов
/ 02 декабря 2009

Я слышал о людях, которые делают хаки, например, запускают приложение в эмуляторе, таком как QEMU, и затем запускают GDB (или такие вещи, как valgrind). Это звучит больно, но если это работает ....

Получите ли вы что-нибудь с libunwind (чтобы получить трассировку стека) и журналированием в стиле printf?

1 голос
/ 03 декабря 2009

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

Если у вас нет последовательного порта, мы использовали порт GPIO и имитировали последовательный порт, используя его. Это работало на отлично, но было немного медленно :-( ~~~

0 голосов
/ 09 декабря 2009

Gdbserver действительно работает с многопоточными приложениями. Однако вам нужно скомпилировать перекрестный отладчик для вашего хоста, чтобы он работал с вашим целевым gdb.

См. Эту статью для подробного описания, как это сделать:

Удаленная отладка между целями с GDB и GDBserver

0 голосов
/ 07 декабря 2009

Есть ли причина, по которой вы создали собственный отладчик? Я занимаюсь разработкой системы Linux с использованием процессора ARM (AT91SAM926x), и мы используем как компилятор, так и отладчик из CodeSourcery. Я не думаю, что они выпустили версию с GDB 7, но я без проблем отлаживаю многопоточные приложения C ++, используя инструмент gdbserver.

...