В настоящее время я отлаживаю модуль ядра, и для этой цели я создал все ядро с отладочной информацией (производит 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
, чтобы проверить, что произошло (что хорошо работает).
Вы пытались установить точку останова на определенной строке вместо символа? Кроме того, вы можете заставить компилятор не встроить код. – Hasturkun
Используете ли вы какую-нибудь опцию зачистки? –