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

Вот так:-)

Другие вопросы по тегам