簡體   English   中英

使用 kretprobe 或 bpf 獲取函數的返回地址

[英]Get return address of a function using kretprobe or bpf

是否可以使用kretprobeBPF代碼確定內核函數返回的位置? 例如;

void func()
{
.........some line......
.........some line......
  if (condition1)
    return;
.........some line......
.........some line......
  if(condition2)
     return;
.........some line......
  if(condition3)
     return;
.........some line......
.........some line......
.........some line......
  return;
}

如果我有這樣的內核函數,我怎么知道命中了哪個返回值?

我猜你可以在每條返回線上創建一個 kprobe。

如果您是您嘗試跟蹤的函數的作者,我只是將全局變量設置為每個分支的特定值。

是的,可以使用 kretprobe 或 BPF 代碼確定內核函數返回的位置。

一種方法是在 BPF 代碼中使用 kprobe_return 函數,它允許您定義一個回調函數,該函數將在內核函數返回時調用。 然后,您可以使用此回調函數通過檢查相關條件的值來確定命中了哪個返回語句。

下面是一個示例,說明如何使用 kprobe_return 來確定在上面的內核函數中命中了哪個返回語句:

#include <linux/bpf.h>
#include <linux/sched.h>

BPF_HASH(return_counts, u32, u64);

int count_returns(struct pt_regs *ctx) {
    u32 key = 0;  // Key for the hashmap

    // Check the values of the relevant conditions to determine which return statement was hit
    if (condition1) {
        key = 1;
    } else if (condition2) {
        key = 2;
    } else if (condition3) {
        key = 3;
    } else {
        key = 4;
    }

    u64 *count = return_counts.lookup(&key);
    if (count) {
        (*count)++;
    } else {
        return_counts.update(&key, &(u64){1});
    }

    return 0;
}

int trace_func_returns(struct kretprobe_instance *ri, struct pt_regs *regs) {
    return count_returns(regs);
}

struct kretprobe my_kretprobe = {
    .kp.symbol_name = "func",
    .handler = trace_func_returns,
};

這段代碼定義了一個名為 return_counts 的 BPF hashmap,它將用於存儲每個 return 語句的計數。 count_returns 函數在內核函數返回時被調用,它通過檢查相關條件的值來確定命中了哪個返回語句。 然后它會增加 return_counts 散列映射中該 return 語句的計數。

trace_func_returns 函數是內核函數返回時調用的回調函數,它只是調用count_returns 函數來做計算返回的工作。 最后,my_kretprobe結構體用於為內核函數func定義一個kretprobe,並指定kretprobe觸發時應該調用的回調函數trace_func_returns。

暫無
暫無

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

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