Skip to content

Commit 0593245

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

File tree

1 file changed

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

1 file changed

+22
-29
lines changed

kernel/src/debug/traceback/mod.rs

Lines changed: 22 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -21,38 +21,31 @@ 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(0) => sym_num, // 地址小于第一个符号
34+
Err(i) => i - 1,
5535
};
36+
let sym_name = CStr::from_ptr(sym_names.add(sym_names_index[index] as usize) as _)
37+
.to_str()
38+
.unwrap();
39+
if sym_name.starts_with("kernel_main") {
40+
is_kernel_main = true;
41+
}
42+
println!(
43+
"[{}] function:{}() \t(+) {:04} address:{:#018x}",
44+
level,
45+
sym_name,
46+
addr - kallsyms_address_list[index],
47+
addr
48+
);
5649
return is_kernel_main;
5750
}
5851

0 commit comments

Comments
 (0)