include names in stack trace
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,5 +1,6 @@
|
|||||||
/target
|
/target
|
||||||
/bin
|
/bin
|
||||||
|
/scripts/*/**
|
||||||
|
|
||||||
# Bochs
|
# Bochs
|
||||||
bx_enh_dbg.ini
|
bx_enh_dbg.ini
|
||||||
6
Makefile
6
Makefile
@@ -89,6 +89,12 @@ endif
|
|||||||
|
|
||||||
build-iso: partition-iso
|
build-iso: partition-iso
|
||||||
nm target/${ARCH}-unknown-none/${MODE}/CappuccinOS.elf > scripts/symbols.table
|
nm target/${ARCH}-unknown-none/${MODE}/CappuccinOS.elf > scripts/symbols.table
|
||||||
|
@if [ ! -d "scripts/rustc_demangle" ]; then \
|
||||||
|
echo "Cloning repository into scripts/rustc_demangle..."; \
|
||||||
|
git clone "https://github.com/juls0730/rustc_demangle.py" "scripts/rustc_demangle"; \
|
||||||
|
else \
|
||||||
|
echo "Folder scripts/rustc_demangle already exists. Skipping clone."; \
|
||||||
|
fi
|
||||||
python scripts/demangle-symbols.py
|
python scripts/demangle-symbols.py
|
||||||
mv scripts/symbols.table ${ISO_PATH}/boot
|
mv scripts/symbols.table ${ISO_PATH}/boot
|
||||||
# Install the Limine bootloader on the ISO
|
# Install the Limine bootloader on the ISO
|
||||||
|
|||||||
35007
disassembly.txt
Normal file
35007
disassembly.txt
Normal file
File diff suppressed because it is too large
Load Diff
1
scripts/rustc_demangle
Submodule
1
scripts/rustc_demangle
Submodule
Submodule scripts/rustc_demangle added at 9c7b8459ec
@@ -1,3 +1,5 @@
|
|||||||
|
use alloc::{borrow::ToOwned, string::String, vec::Vec};
|
||||||
|
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
#[derive(Clone, Copy, Debug)]
|
#[derive(Clone, Copy, Debug)]
|
||||||
struct StackFrame {
|
struct StackFrame {
|
||||||
@@ -18,9 +20,79 @@ pub fn print_stack_trace(max_frames: usize) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let instruction_pointer = unsafe { (*stackframe).rip };
|
||||||
|
|
||||||
|
crate::print!(" {:#X} ", instruction_pointer);
|
||||||
|
|
||||||
|
let instrcution_info = get_function_name(instruction_pointer);
|
||||||
|
|
||||||
|
if let Ok((function_name, function_offset)) = instrcution_info {
|
||||||
|
crate::println!("<{}+{:#X}>", function_name, function_offset);
|
||||||
|
} else {
|
||||||
|
crate::println!();
|
||||||
|
}
|
||||||
|
|
||||||
unsafe {
|
unsafe {
|
||||||
crate::println!(" {:#X}", (*stackframe).rip);
|
|
||||||
stackframe = (*stackframe).back;
|
stackframe = (*stackframe).back;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn get_function_name(function_address: u64) -> Result<(String, u64), ()> {
|
||||||
|
if crate::drivers::fs::vfs::VFS_INSTANCES.lock().read().len() == 0 {
|
||||||
|
return Err(());
|
||||||
|
}
|
||||||
|
|
||||||
|
let vfs_lock = crate::drivers::fs::vfs::VFS_INSTANCES.lock();
|
||||||
|
|
||||||
|
let symbols_fd = vfs_lock.read()[0].open("/boot/symbols.table")?;
|
||||||
|
|
||||||
|
let symbols_table_bytes = symbols_fd.read()?;
|
||||||
|
let symbols_table = core::str::from_utf8(&symbols_table_bytes).ok().ok_or(())?;
|
||||||
|
|
||||||
|
let mut previous_symbol: Option<(&str, u64)> = None;
|
||||||
|
|
||||||
|
let symbols_table_lines: Vec<&str> = symbols_table.lines().collect();
|
||||||
|
|
||||||
|
for (i, line) in symbols_table_lines.iter().enumerate() {
|
||||||
|
let line_parts: Vec<&str> = line.splitn(2, ' ').collect();
|
||||||
|
|
||||||
|
if line_parts.len() < 2 {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
let (address, function_name) = (
|
||||||
|
u64::from_str_radix(&line_parts[0], 16).ok().ok_or(())?,
|
||||||
|
line_parts[1],
|
||||||
|
);
|
||||||
|
|
||||||
|
if address == function_address {
|
||||||
|
return Ok((function_name.to_owned(), 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
if i == symbols_table_lines.len() - 1 {
|
||||||
|
return Ok((function_name.to_owned(), function_address - address));
|
||||||
|
}
|
||||||
|
|
||||||
|
if i == 0 {
|
||||||
|
if function_address < address {
|
||||||
|
return Err(());
|
||||||
|
}
|
||||||
|
|
||||||
|
previous_symbol = Some((function_name, address));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if function_address > previous_symbol.unwrap().1 && function_address < address {
|
||||||
|
// function is previous symbol
|
||||||
|
return Ok((
|
||||||
|
previous_symbol.unwrap().0.to_owned(),
|
||||||
|
address - previous_symbol.unwrap().1,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
previous_symbol = Some((function_name, address));
|
||||||
|
}
|
||||||
|
|
||||||
|
unreachable!();
|
||||||
|
}
|
||||||
|
|||||||
@@ -466,7 +466,7 @@ struct FatFile<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> VFSFile for FatFile<'a> {
|
impl<'a> VFSFile for FatFile<'a> {
|
||||||
fn read(&self) -> Result<Arc<[u8]>, ()> {
|
fn read(&self) -> Result<Vec<u8>, ()> {
|
||||||
let mut file: Vec<u8> = Vec::with_capacity(self.file_entry.file_size as usize);
|
let mut file: Vec<u8> = Vec::with_capacity(self.file_entry.file_size as usize);
|
||||||
let mut file_ptr_index = 0;
|
let mut file_ptr_index = 0;
|
||||||
|
|
||||||
@@ -507,7 +507,7 @@ impl<'a> VFSFile for FatFile<'a> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return Ok(Arc::from(file));
|
return Ok(file);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -517,7 +517,7 @@ struct FatDirectory<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> VFSDirectory for FatDirectory<'a> {
|
impl<'a> VFSDirectory for FatDirectory<'a> {
|
||||||
fn list_files(&self) -> Result<Arc<[Box<dyn VFSFile>]>, ()> {
|
fn list_files(&self) -> Result<Vec<Box<dyn VFSFile>>, ()> {
|
||||||
unimplemented!();
|
unimplemented!();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
use alloc::{boxed::Box, sync::Arc, vec::Vec};
|
use alloc::{boxed::Box, vec::Vec};
|
||||||
|
|
||||||
use crate::libs::mutex::Mutex;
|
use crate::libs::mutex::Mutex;
|
||||||
|
|
||||||
@@ -8,11 +8,11 @@ pub trait VFSFileSystem {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub trait VFSFile {
|
pub trait VFSFile {
|
||||||
fn read(&self) -> Result<Arc<[u8]>, ()>;
|
fn read(&self) -> Result<Vec<u8>, ()>;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait VFSDirectory {
|
pub trait VFSDirectory {
|
||||||
fn list_files(&self) -> Result<Arc<[Box<dyn VFSFile>]>, ()>;
|
fn list_files(&self) -> Result<Vec<Box<dyn VFSFile>>, ()>;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub static VFS_INSTANCES: Mutex<Vec<VFS>> = Mutex::new(Vec::new());
|
pub static VFS_INSTANCES: Mutex<Vec<VFS>> = Mutex::new(Vec::new());
|
||||||
|
|||||||
@@ -133,6 +133,10 @@ pub fn handle_key(mut key: Key) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn prompt() {
|
pub fn prompt() {
|
||||||
|
unsafe {
|
||||||
|
core::arch::asm!("div rax, {0:r}", in(reg) 0x00);
|
||||||
|
};
|
||||||
|
|
||||||
super::tty::CONSOLE.puts("> ");
|
super::tty::CONSOLE.puts("> ");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user