2013-06-03 3 views
0

В настоящее время я отлаживаю модуль ядра, и для этой цели я создал все ядро ​​с отладочной информацией (производит kallsyms и т. Д.).Почему некоторые символы отладки отсутствуют и как их отслеживать?

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

В любом случае, при запуске ядра с qemu-kgdb/gdb, я могу видеть, что вызывается функция «отсутствует». Это означает, что компилятор не уничтожил его, потому что он никогда не использовался в каком-либо кодовом пути (отсюда и мое «чувство»).

Поскольку символ не отображается, я не могу установить точку останова на нем, и gdb не будет разворачивать его так, чтобы я мог видеть путь к запущенному коду - понять Я не знаю, как сказать gdb, чтобы развернуть это.
К сожалению, я хочу увидеть эту часть пути кода ... Как я могу это сделать?

EDIT: Как было предложено в ответе Тома, я попытался с помощью file:line синтаксиса, как показано ниже:

Моего файла код выглядит следующим образом:

int foo(int arg) // The function that I suspect to be inlined - here is line 1 
{ 
    /* Blabla */ 
    return 42; 
} 

void foo2(void) 
{ 
    foo(0); // Line 9 
} 

Я попытался b file.c:1, и точка останов был поражен но функция foo() не разворачивается. Конечно, я создаю символы отладки, так как я также установил точку останова на foo2, чтобы проверить, что произошло (что хорошо работает).

+0

Вы пытались установить точку останова на определенной строке вместо символа? Кроме того, вы можете заставить компилятор не встроить код. – Hasturkun

+0

Используете ли вы какую-нибудь опцию зачистки? –

ответ

2

Вы не скажете, какую версию gdb вы используете.

Очень старые версии gdb не поддерживают встроенные функции. Это было верно для 6.8 и, возможно, даже 7.0 - я не помню. Вы можете посмотреть файл NEWS для своего gdb.

Затем были некоторые версии gdb, которые поддерживали точки останова на встроенных функциях, но только с использованием синтаксиса «file: line». Так что вы могли бы сделать, это посмотреть на функцию в редакторе, и найти его номер строки и введите, например:

(gdb) break myfile.c:777 

Даже более поздние версии GDB, начиная с 7.4 или 7.5 (я забываю) будет обрабатывать " функция прерывания "просто отлично, если" функция "была встроена.

Все это работает только в том случае, если у вас имеется debuginfo. Поэтому, если вы пробовали это, и это не удалось, либо у вас есть старший gdb, либо вы забыли использовать -g.

В gdb нет хорошего способа увидеть, какие объекты в компиляции отсутствовали -g. Вы можете видеть это довольно легко из оболочки, хотя, запустив «readelf -WS» в файлах .o и ища файлы, которые не имеют секции .debug_info.

+0

'gdb --version' сообщает мне' GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1) 7.4-2012.04'. Я попробовал ваше предложение, используя синтаксис «file: line». Точка останова хорошо зарегистрирована и помечена как попадание, когда путь кода достигнет ее, но инструкция никогда не «разворачивается». – Rerito

+0

Я не знаю, что означает «разворот», извините. –

+0

Я имею в виду, что отладчик не показывает мне внутренние инструкции встроенной функции, если я запускаю с помощью stepi, я снова и снова показываю строку 'foo (0);'. – Rerito

0

Установка точки останова для линии подписи функции не работает. Но установка одной на линию инструкции встроенной функции решила проблему для меня. Например, учитывая следующую функцию inline_foo, найденную в myfile.с:

inline int inline_foo(int arg) // l.1 
{ 
    int a_var = 0; 
    do_smth(&a_var); 
    do_some_other_thing(); // l.5 
    if (a_var) { 
     a_var = blob(); 
    } else { 
     a_var = blub(); 
    return a_var; // l.10 
} 

Я пытался b myfile.c:1, который не явился на работу. Но если я попробовал b myfile.c:3 вместо этого, точка останова была хорошо обработана GDB. Поскольку техника такая же, как описанная ранее Томом, я приму его ответ.

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