Как установить точку останова VxWorks для статической функции C? - PullRequest
1 голос
/ 06 января 2012

Я работаю на платформе vxworks в C. Я не могу установить точку останова для статической функции C.Фактически, когда я делаю lkup на имя функции, когда код загружен на мою карту, он не найден.

Если я использую nm и grep, чтобы найти символ в исполняемом файле, он будет выглядеть точно так же, как и имя функции.Мы портируем код на нашу платформу, которая использует (правильно) ключевое слово static для большого количества функций, но мне больно, что я не могу установить точку останова ни для одной из них.

Кто-нибудь знает, почему яне могу увидеть статические функции Си на lkup и как их искать и установить точку останова.

Спасибо,

Роб

Ответы [ 3 ]

1 голос
/ 07 января 2012

Предполагая, что подпрограмма действительно существует, как и следовало ожидать (то есть не оптимизирована или не встроена) - я использовала пару подходов в таких ситуациях:

Точка останова сборки

  • допустим, вы хотите установить точку останова в статической функции foo(). Найдите код, который вызывает foo() - скажем, bar() вызывает foo(). Где bar() вызывает foo(), установить точку останова.

  • работает до тех пор, пока вы не достигнете точки останова, где bar() вызывает foo(). шаг на уровне сборки. Это должно поставить вас на первой инструкции foo(). Обратите внимание, что вам, возможно, придется выполнить несколько инструкций, если есть передаваемые параметры - надеюсь, вы знаете, как выглядит вызов ветви / подпрограммы в вашей архитектуре.

  • Установить точку останова сборки при посадке по первой инструкции foo().

Указатель функции

Я также работал над этим, инициализируя указатель на функцию с адресом foo(). Когда система работает, прочитайте указатель на функцию в отладчике. Получите адрес foo(). Установите точку останова на основе этого адреса.

Обратите внимание, что в этих случаях у вас может не быть чередующегося источника.

0 голосов
/ 07 января 2012

Судя по всему, вы используете оболочку для отладки и установки точек останова.
В этом случае у вас может быть проблема, поскольку статическая функция имеет внутреннюю связь и больше не является глобально видимой функцией(в оболочку).

Если вы используете DKM и используете команду ld для загрузки модулей, вы можете добавить в LD параметр, который также будет включать статические символы, которыми вы затем сможете манипулировать воболочки.

0 голосов
/ 06 января 2012

Я не думаю, что можно делать то, что вы хотите.Компилятору не требуется генерировать символы для статических функций, он может даже встроить их.

Пример:

$ gcc -o test test.c
$ nm test | grep foo
0000000000400524 t foo
$ gcc -O2 -o test test.c
$ nm test | grep foo
$
...