Как напечатать текущую трассировку стека потоков внутри ядра Linux?
Я хотел бы иметь возможность печатать трассировку стека потока в ядре Linux.
Подробно: я хочу добавить код для определенных функций (например, swap_writepage()
), который напечатает полную трассировку стека потока, в котором вызывается эта функция. Что-то вроде этого:
int swap_writepage(struct page *page, struct writeback_control *wbc)
{
/* code goes here to print stack trace */
int ret = 0;
if (try_to_free_swap(page)) {
unlock_page(page);
goto out;
}
if (frontswap_store(page) == 0) {
set_page_writeback(page);
unlock_page(page);
end_page_writeback(page);
goto out;
}
ret = __swap_writepage(page, wbc, end_swap_bio_write);
out:
return ret;
}
Моя история: В последнее время разработчики ядра Linux начали применять объектно-ориентированные принципы при улучшении ядра, которое написано на C. Так как C не является языком OO, вещи стали выглядеть очень уродливо и сложнее для понимания, не говоря уже о том, чтобы не иметь приличного IDE, которая может анализировать C-код. И я не хочу начинать запуск Linux под отладчиком. Примечание: если вы новичок в разработке ядра и хотите запустить Linux под отладчиком, не прилагайте к этому усилий... это окажется бесполезным (шаг не имеет смысла).
2 ответа
Ядро Linux имеет очень хорошо известную функцию под названием dump_stack()
здесь, который печатает содержимое стека. Поместите его в свою функцию в соответствии с информацией стека.
@rakib точно прав конечно.
Кроме того, я хотел бы отметить, что можно определить простые и элегантные макросы, которые помогают печатать отладочную информацию по мере необходимости. На протяжении многих лет я помещал эти макросы и правила в заголовочный файл; Вы можете проверить это и скачать здесь: "Удобный заголовок".
Есть макросы / функции для:
- производить отладочную печать вместе с funcname / line# info (через обычные printk() или trace_printk()) и только если включен режим DEBUG
- выгрузить стек режима ядра
- печатать текущий контекст (обрабатывать или прерывать вместе с флагами в форме, которую использует ftrace)
- простой макрос assert() (!)
- DELAY_LOOP с интенсивным использованием процессора (полезно для тестовых установок, которые должны вращаться на процессоре)
- эквивалент пользовательского режима сна
- функция для расчета дельты времени по двум временным меткам (временные структуры)
- преобразовать десятичную в двоичную и
- еще несколько.
Вот так:-)