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 在 操作系统 分类中
4,329 每月下载量
用于 14 个crate(直接使用10个)
240KB
7.5K SLoC
remoteprocess
此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