Как установить точку останова VxWorks для статической функции C?

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

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

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

Спасибо,

Роб


person user463477    schedule 06.01.2012    source источник
comment
Какой отладчик вы используете? В зависимости от вашего варианта оптимизации ваша статическая функция может быть встроена компилятором. Вот почему вы можете не найти его символ. Но вы должны иметь возможность установить точку останова, если вы скомпилировали свой объект с отладочной информацией.   -  person greydet    schedule 06.01.2012
comment
Я предполагаю, что greydet прав в том, что его оптимизируют. Попробуйте отключить всю оптимизацию во время отладки. Если у вас есть ограничения по пространству или требования к реальному времени, которые не позволяют отключить всю оптимизацию, некоторые компиляторы позволяют вам изменять оптимизацию для единиц компиляции или даже функций на индивидуальной основе. Например, #pragma optimize и одноименный атрибут в GCC. Я думаю, что компилятор WindRiver по сути является gcc.   -  person Brian McFarland    schedule 06.01.2012
comment
@user463477: user463477: была такая же проблема, затем добавили флаг -g и флаг отсутствия оптимизации...   -  person Greg McNulty    schedule 25.11.2015


Ответы (3)


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

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

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

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

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

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

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

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

person Dan    schedule 07.01.2012

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

Пример:

$ gcc -o test test.c
$ nm test | grep foo
0000000000400524 t foo
$ gcc -O2 -o test test.c
$ nm test | grep foo
$
person Community    schedule 06.01.2012
comment
Я никогда не видел, чтобы GCC встраивал статическую функцию с -O0. Инлайнинг — это, в конце концов, оптимизация. - person Brian McFarland; 07.01.2012

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

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

person Benoit    schedule 07.01.2012