簡體   English   中英

如何在 Linux 內核中打印當前線程堆棧跟蹤?

[英]How to print the current thread stack trace inside the Linux kernel?

我希望能夠打印 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 不是面向對象的語言,所以事情開始變得非常丑陋且難以理解,更不用說沒有像樣的可以分析 C 代碼的 IDE。 我不想開始在調試器下運行 Linux。 注意:如果您是內核開發新手並且想在調試器下運行 Linux,請不要為此付出努力……這將被證明是徒勞的(單步執行是沒有意義的)。

Linux 內核有一個非常有名的函數,叫做dump_stack() here ,它打印堆棧的內容。 根據查看堆棧信息將其放入您的函數中。

@rakib 當然是完全正確的。

此外,我想指出的是,可以定義簡單而優雅的宏來幫助在需要時打印調試信息。 多年來,我將這些宏和便利例程放入頭文件中; 您可以在此處查看並下載:“A Header of Convenience”

有宏/函數可以:

  • 使調試打印連同 funcname / line# info(通過通常的 printk() 或 trace_printk())並且僅當調試模式為 On 時
  • 轉儲內核模式堆棧
  • 打印當前上下文(進程或中斷以及ftrace使用的形式的標志)
  • 一個簡單的 assert() 宏 (!)
  • cpu 密集型 DELAY_LOOP(對於必須在處理器上旋轉的測試台很有用)
  • 相當於用戶模式睡眠功能
  • 一個函數來計算給定兩個時間戳的時間增量(timeval 結構)
  • 將十進制轉換為二進制,以及
  • 還有幾個。

哇:-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM