Skip to content

Commit 92c3cec

Browse files
committed
fix(lookup_kallsyms): 修复符号表查询问题
原有逻辑addr刚好等于kallsyms_adress_list[i+1]时,索引index值会是i,但是实际上是i+1;现在修改为通过二分查找符号
1 parent b466adf commit 92c3cec

File tree

1 file changed

+5
-8
lines changed
  • kernel/src/debug/traceback

1 file changed

+5
-8
lines changed

kernel/src/debug/traceback/mod.rs

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,16 @@ fn kallsyms_names() {}
1717
/// return true if the func is kernel_main
1818
pub unsafe fn lookup_kallsyms(addr: u64, level: i32) -> bool {
1919
let sym_names = kallsyms_names as *const u8;
20-
// 由于符号表使用nm -n生成,因此是按照地址升序排列的,因此可以二分
2120
let sym_num = kallsyms_num as usize;
2221
let kallsyms_address_list =
2322
core::slice::from_raw_parts(kallsyms_address as *const u64, sym_num);
2423
let sym_names_index = kallsyms_names_index as *const u64;
2524
let sym_names_index = core::slice::from_raw_parts(sym_names_index, sym_num);
26-
let mut index = usize::MAX;
27-
for i in 0..sym_num - 1 {
28-
if addr > kallsyms_address_list[i] && addr <= kallsyms_address_list[i + 1] {
29-
index = i;
30-
break;
31-
}
32-
}
25+
let index = match kallsyms_address_list.binary_search(&addr) {
26+
Ok(i) => i,
27+
Err(0) => sym_num, // 地址小于第一个符号
28+
Err(i) => i - 1,
29+
};
3330
let mut is_kernel_main = false;
3431
if index < sym_num {
3532
let sym_name = CStr::from_ptr(sym_names.add(sym_names_index[index] as usize) as _)

0 commit comments

Comments
 (0)