2

Я занимаюсь встроенной разработкой на плате AT91SAM9263 и сталкиваюсь с непонятной проблемой. Он запускает debian Linux kernel 2.6.18.4 и кросс-компилируется с помощью arm-linux-gcc 3.4.6 и использует uClibc-0.9.28 для библиотеки C. Я отлаживаю драйвер устройства ядра, и определенная функция не появляется в файле System.map. Понятно, что я не могу установить на нем точку останова. Как ни странно, если я ворву в его вызывающую функцию, я не могу в нее вступить - команда nexti gdb выполняет ее, но пропускает мимо источника. Функция is atmel_rx_chars (struct uart_port * port). Это статическая функция void, объявленная в atmel_serial.c, пример которой появляется в [1]. Существуют другие статические функции void в одном файле (atmel_tx_chars (struct uart_port * port), например), которые объявлены в одном файле и фактически индексируются в файле System.map. Согласно [2] «System.map создается« nm vmlinux », а нерелевантные или неинтересные символы вытесняются». Я попытался использовать nm (а также objdump), чтобы просмотреть все символы, и он все еще не отображается в выводе. Однако, когда я grep atmel_rx_chars vmlinux, он возвращает совпадение. Раньше я считал себя немного могущественным пользователем, но после этого я действительно в тупике. Любые советы будут оценены наиболее высоко.Имя функции и адрес отсутствуют в Linux System.map

Спасибо,

Jayce

[1] http://lxr.free-electrons.com/source/drivers/serial/atmel_serial.c#L379
[2] http://www.faqs.org/docs/Linux-HOWTO/Kernel-HOWTO.html#systemmap

+0

как вы скомпилируете код? звучит так, как если бы код был скомпилирован с помощью оптимизационных переключателей, которые в gdb пропускают мимо него или system.map не синхронизируется с ядром? – t0mm13b

+0

Ядро скомпилировано без оптимизации и с включенной функцией -g (отладочная информация). Опять же, мне интересно, что другие функции одного и того же типа возврата и подписи, которые определены в одном файле, отображаются в файле System.map и видны отладчику, но эта одна функция таинственно отсутствует. Благодарю вас за предложение. -jayce – user277453

+0

Я ошибаюсь - ядро ​​скомпилировано с -Os и с включенным -g. Я попытался скомпилировать с -O0, но он ломается на [корень ядра] /net/core/dev.c +1710 и +1717. – user277453

ответ

0

Для тех, кто может быть заинтересован, я не мог понять, почему он не отображает atmel_rx_chars в адрес в System.map. Вы все равно можете установить контрольную точку как обычно, чтобы отлаживать эту ситуацию. Полагаю, это должно было быть более очевидным, когда я искал ответы. Во всяком случае в командной строке GDB типа

b source_file.c:line# 

так в этом примере, было бы

b atmel_serial.c:381 

и он сломается, когда вы попали в «недостающую» рутина. Тем не менее это все еще является неполным решением. Разрыв в определенной строке работает, но он не оставляет рамку стека вызывающей функции (atmel_handle_receive), поэтому локали atmel_rx_chars недоступны для gdb. Как всегда, любая помощь или понимание будут оценены. Надеюсь, что это будет хорошим прыжком, если кто-то еще столкнется с этой проблемой или с ней похож.

Спасибо,

Jayce

2

Причина вы не видите, что это потому, что компилятор встраивание этой функции. Он объявлен статичным и только вызывается в одном месте, поэтому компилятор строит его. Если вы хотите поместить на него точку останова, измените источник, чтобы он больше не был объявлен статическим и перекомпилировал.

 Смежные вопросы

  • Нет связанных вопросов^_^