21个版本

0.4.13 2023年11月17日
0.4.12 2023年6月8日
0.4.11 2022年12月5日
0.4.10 2022年7月29日
0.1.0 2019年7月7日

#73操作系统 分类中

Download history 756/week @ 2024-04-23 965/week @ 2024-04-30 881/week @ 2024-05-07 926/week @ 2024-05-14 935/week @ 2024-05-21 1177/week @ 2024-05-28 994/week @ 2024-06-04 1274/week @ 2024-06-11 846/week @ 2024-06-18 936/week @ 2024-06-25 578/week @ 2024-07-02 966/week @ 2024-07-09 938/week @ 2024-07-16 1251/week @ 2024-07-23 1048/week @ 2024-07-30 928/week @ 2024-08-06

4,329 每月下载量
用于 14 个crate(直接使用10个)

MIT 协议

240KB
7.5K SLoC

remoteprocess

Build Status FreeBSD Build Status

此crate提供了一种跨平台的方法来查询系统上运行的其它进程信息。这允许您构建分析和调试工具。

特性

  • 挂起进程的执行
  • 获取进程的可执行文件名和当前工作目录
  • 获取进程的命令行
  • 列出进程中的所有线程
  • 获取进程的所有子进程
  • 确定线程是否活跃
  • 从其他进程读取内存(使用read_proceses_memory crate)

通过启用unwind特性,您还可以

  • 为目标进程中的线程获取堆栈跟踪
  • 解析其他进程中的地址的符号

此crate为Linux、OSX、FreeBSD和Windows提供了实现

用法

要显示程序中每个线程的堆栈跟踪

fn get_backtrace(pid: remoteprocess::Pid) -> Result<(), remoteprocess::Error> {
    // Create a new handle to the process
    let process = remoteprocess::Process::new(pid)?;

    // lock the process to get a consistent snapshot. Unwinding will fail otherwise
    let _lock = process.lock()?;

    // Create a stack unwind object, and use it to get the stack for each thread
    let unwinder = process.unwinder()?;
    for thread in process.threads()?.iter() {
        println!("Thread {}", thread);

        // Iterate over the callstack for the current thread
        for ip in unwinder.cursor(thread)? {
            let ip = ip?;

            // Lookup the current stack frame containing a filename/function/linenumber etc
            // for the current address
            unwinder.symbolicate(ip, &mut |sf| {
                println!("{}", sf);
            })?;
        }
    }
    Ok(())
}

包含此代码的完整程序可以在示例文件夹中找到。

限制

目前我们仅在部分平台上实现了获取堆栈跟踪的功能

Linux Windows OSX FreeBSD
i686
x86-64 yes yes
ARM yes
Aarch64

鸣谢

此crate高度依赖gimli项目。Gimli是一个解析DWARF调试信息的出色工具,我们在这里使用它来根据指令指针查找文件名和行号。

依赖

~3–13MB
~147K SLoC