#pdb #line-numbers #addr2line #symbolicate #filename

pdb-addr2line

像addr2line一样,从PDB文件中解析地址

19 个不稳定版本

0.11.0 2023年12月13日
0.10.4 2022年11月15日
0.10.2 2022年7月25日
0.7.1 2021年10月3日
0.4.0 2021年6月13日

#55调试

Download history 4890/week @ 2024-04-23 5727/week @ 2024-04-30 4311/week @ 2024-05-07 3521/week @ 2024-05-14 3975/week @ 2024-05-21 4587/week @ 2024-05-28 5182/week @ 2024-06-04 3864/week @ 2024-06-11 2979/week @ 2024-06-18 3075/week @ 2024-06-25 3774/week @ 2024-07-02 4544/week @ 2024-07-09 4359/week @ 2024-07-16 5479/week @ 2024-07-23 5145/week @ 2024-07-30 5221/week @ 2024-08-06

21,066 每月下载量
用于 17 个crates (直接使用4个)

MIT/Apache

115KB
2K SLoC

crates.io page docs.rs page

pdb-addr2line

通过PDB文件解析地址到函数名称,以及到文件名和行号信息。支持内联堆栈。

此crate的API旨在与addr2line crate的API相似;两个Context API具有相似的功能。此crate用于PDB文件,而addr2line用于DWARF数据(例如在ELF和mach-o二进制文件中使用的)。

此crate还有一个TypeFormatter API,可以用来独立于Context获取函数签名字符串。

要创建一个Context,请使用ContextPdbData

实现使用了优秀的pdb crate

示例

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

fn look_up_addresses<'s, S: pdb::Source<'s> + '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(())
}

命令行使用

此仓库还包含一个模仿addr2line的CLI可执行文件。您可以使用cargo install进行安装

cargo install --examples pdb-addr2line

以下是一些示例用法

$ curl -o dcomp.pdb -L "https://msdl.microsoft.com/download/symbols/dcomp.pdb/648B8DD0780A4E22FA7FA89B84633C231/dcomp.pdb"
$ pdb-addr2line --exe dcomp.pdb -fC 0x59aa0 0x52340 0x13498
Windows::UI::Composition::Compositor::Api::CreateScalarKeyFrameAnimation(Windows::UI::Composition::IScalarKeyFrameAnimation**)
??:?
std::map<unsigned int, Windows::UI::Composition::AnimationLoggingManager::ReferencedObject, std::less<unsigned int>, std::allocator<std::pair<unsigned int const, Windows::UI::Composition::AnimationLoggingManager::ReferencedObject> > >::_Try_emplace<unsigned int const&>(unsigned int const&)
??:?
DirectComposition::CDxDevice::RemoveGuardRect(ID3D11Texture2D*)
??:?
$ curl -o mozglue.pdb -L "https://github.com/mstange/profiler-get-symbols/raw/master/fixtures/win64-ci/mozglue.pdb"
$ pdb-addr2line -e mozglue.pdb -psfi 0x3b9fb
mozilla::JSONWriter::StartCollection(char const*, char const*, mozilla::JSONWriter::CollectionStyle) at JSONWriter.h:318
 (inlined by) mozilla::JSONWriter::StartArrayProperty(char const*, mozilla::JSONWriter::CollectionStyle) at JSONWriter.h:417
 (inlined by) mozilla::JSONWriter::StartArrayElement(mozilla::JSONWriter::CollectionStyle) at JSONWriter.h:422
 (inlined by) mozilla::baseprofiler::AutoArraySchemaWriter::AutoArraySchemaWriter(mozilla::baseprofiler::SpliceableJSONWriter&, mozilla::baseprofiler::UniqueJSONStrings&) at ProfileBufferEntry.cpp:141
 (inlined by) mozilla::baseprofiler::WriteSample(mozilla::baseprofiler::SpliceableJSONWriter&, mozilla::baseprofiler::UniqueJSONStrings&, mozilla::baseprofiler::ProfileSample const&) at ProfileBufferEntry.cpp:361
 (inlined by) mozilla::baseprofiler::ProfileBuffer::StreamSamplesToJSON::<unnamed-tag>::operator()(mozilla::ProfileChunkedBuffer::Reader*) const at ProfileBufferEntry.cpp:809

性能

pdb-addr2line通过缓存解析信息优化速度,尽可能懒惰地解析内联、文件和行号等调试信息。

许可证

许可协议为以下之一

任由您选择。

除非您明确说明,否则根据Apache-2.0许可证定义,您有意提交以包含在作品中的任何贡献,将按上述方式双重许可,没有任何附加条款或条件。

依赖项

~1.5-2MB
~43K SLoC