Intereting Posts
Что не так с этим примером ?popen / select? Будет ли этот трюк работать в C? Является ли (x ++, y) + (y ++, x) неопределенным или неопределенным, а если не указано, что он может вычислить? в чем разница между AM_LDFLAGS и LDFLAGS Выделите строку (char *) в другой функции Возврат каретки требуется при печати на консоль в Windows? где и когда глобальные статические и локальные статические данные сохраняются и инициализируются? Как контролировать переменные в GDB и регистрировать его, если он соответствует определенным условиям? Лучше ли распределять память во власти двух? Получение уведомлений о мощности (особенно выключение) на Mac OSX Функция mremap не могла выделить новую память Путаница относительно заявления printf C и C ++: указатель доступа элемента массива vs int Как перевернуть показатель двойника (например, 1e300-> 1e-300)? Размещение директивы препроцессора внутри строкового литерала?

Почему некоторые символы отладки отсутствуют и как их отслеживать?

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

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

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

Поскольку символ не отображается, я не могу установить точку останова на нем, и 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 , и точка останова была b file.c:1 , но функция foo() не разворачивается. Конечно, я создаю символы отладки, так как я также установил foo2 останова для foo2 чтобы проверить, что произошло (что хорошо работало).

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

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

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

 (gdb) break myfile.c:777 

Даже более поздние версии gdb, начиная с 7,4 или 7,5 (я забыл), будут обрабатывать функцию «break» просто отлично, если «функция» была встроена.

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

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

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

 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. Поскольку техника такая же, как описанная ранее Томом, я приму его ответ.