Skip to content

Commit 7c25a1c

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

File tree

1 file changed

+21
-29
lines changed
  • kernel/src/debug/traceback

1 file changed

+21
-29
lines changed

kernel/src/debug/traceback/mod.rs

Lines changed: 21 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -21,38 +21,30 @@ pub unsafe fn lookup_kallsyms(addr: u64, level: i32) -> bool {
2121
let sym_num = kallsyms_num as usize;
2222
let kallsyms_address_list =
2323
core::slice::from_raw_parts(kallsyms_address as *const u64, sym_num);
24+
let mut is_kernel_main = false;
25+
if addr < kallsyms_address_list[0] || addr > kallsyms_address_list[sym_num - 1] {
26+
println!("[{}] function:unknown \taddress:{:#018x}", level, addr);
27+
return is_kernel_main;
28+
}
2429
let sym_names_index = kallsyms_names_index as *const u64;
2530
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-
}
33-
let mut is_kernel_main = false;
34-
if index < sym_num {
35-
let sym_name = CStr::from_ptr(sym_names.add(sym_names_index[index] as usize) as _)
36-
.to_str()
37-
.unwrap();
38-
if sym_name.starts_with("kernel_main") {
39-
is_kernel_main = true;
40-
}
41-
println!(
42-
"[{}] function:{}() \t(+) {:04} address:{:#018x}",
43-
level,
44-
sym_name,
45-
addr - kallsyms_address_list[index],
46-
addr
47-
);
48-
} else {
49-
println!(
50-
"[{}] function:unknown \t(+) {:04} address:{:#018x}",
51-
level,
52-
addr - kallsyms_address_list[sym_num - 1],
53-
addr
54-
);
31+
let index = match kallsyms_address_list.binary_search(&addr) {
32+
Ok(i) => i,
33+
Err(i) => i - 1,
5534
};
35+
let sym_name = CStr::from_ptr(sym_names.add(sym_names_index[index] as usize) as _)
36+
.to_str()
37+
.unwrap();
38+
if sym_name.starts_with("kernel_main") {
39+
is_kernel_main = true;
40+
}
41+
println!(
42+
"[{}] function:{}() \t(+) {:04} address:{:#018x}",
43+
level,
44+
sym_name,
45+
addr - kallsyms_address_list[index],
46+
addr
47+
);
5648
return is_kernel_main;
5749
}
5850

0 commit comments

Comments
 (0)