Crate pdb_addr2line

source
Expand description

Resolve addresses to function names, and to file name and line number information, with the help of a PDB file. Inline stacks are supported.

The API of this crate is intended to be similar to the API of the addr2line crate; the two Context APIs have comparable functionality. This crate is for PDB files whereas addr2line is for DWARF data (which is used in ELF and mach-o binaries, for example).

This crate also has a TypeFormatter API which can be used to get function signature strings independently from a Context.

To create a Context, use ContextPdbData.

§Example

use pdb_addr2line::pdb; // (this is a re-export of the pdb crate)

fn look_up_addresses<'s, S: pdb::Source<'s> + Send + 's>(stream: S, addresses: &[u32]) -> std::result::Result<(), pdb_addr2line::Error> {
    let pdb = pdb::PDB::open(stream)?;
    let context_data = pdb_addr2line::ContextPdbData::try_from_pdb(pdb)?;
    let context = context_data.make_context()?;

    for address in addresses {
        if let Some(procedure_frames) = context.find_frames(*address)? {
            eprintln!("0x{:x} - {} frames:", address, procedure_frames.frames.len());
            for frame in procedure_frames.frames {
                let line_str = frame.line.map(|l| format!("{}", l));
                eprintln!(
                    "     {} at {}:{}",
                    frame.function.as_deref().unwrap_or("<unknown>"),
                    frame.file.as_deref().unwrap_or("??"),
                    line_str.as_deref().unwrap_or("??"),
                )
            }
        } else {
            eprintln!("{:x} - no frames found", address);
        }
    }
    Ok(())
}

Re-exports§

Structs§

Enums§

Traits§

  • This trait is only needed for consumers who want to call Context::new_from_parts or TypeFormatter::new_from_parts manually, instead of using ContextPdbData. If you use ContextPdbData you do not need to worry about this trait. This trait allows Context and TypeFormatter to request parsing of module info on-demand. It also does some lifetime acrobatics so that Context can cache objects which have a lifetime dependency on the module info.