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

Ответ 1

В ядре Linux есть очень хорошо известная функция dump_stack() здесь, которая печатает содержимое стека. Поместите его в свою функцию в соответствии с информацией о стеке.

Ответ 2

@rakib, конечно, точно прав.

Кроме того, я хотел бы указать, что можно определить простые и элегантные макросы, которые помогают распечатывать отладочную информацию по мере необходимости. На протяжении многих лет я помещал эти макросы и вызывал подпрограммы в файл заголовка; вы можете проверить его и скачать его здесь: "Заголовок удобства" .

Есть макросы/функции для:

  • сделать отладочные отпечатки вместе с именем funcname/line # (через обычный printk() или trace_printk()), и только если режим DEBUG включен.
  • сбросить стек режима ядра
  • распечатать текущий контекст (обрабатывать или прерывать вместе с флагами в форме что используется ftrace)
  • простой макрос assert() (!)
  • интенсивный CPU DELAY_LOOP (полезен для тестовых установок, которые должны вращаться на процессоре).
  • эквивалент функции usermode sleep
  • функция для вычисления временной дельта, заданной двумя временными метками (структуры времени)
  • преобразовать десятичную в двоичную и
  • еще несколько.

Whew: -)