ThreadStacks C/C++ 进程堆栈追踪库开源项目

我要开发同款
匿名用户2018年04月27日
51阅读
开发技术C/C++
所属分类程序开发、其他开发相关
授权协议MIT

作品详情

ThreadStacks可用于检查与ThreadStacks库链接的活动进程的所有线程。粗略地说,ThreadStacks为C/C++程序提供了相当于Golang的runtime.Stack()。除了编程访问堆栈跟踪之外,ThreadStacks还提供了jmap样式实用程序,其中kill-35可用于让实时进程将其所有线程的堆栈跟踪写入stderr。

ThreadStacks是适用于测试和生产环境的主要调试工具,它帮助调试堆栈中某些最关键服务的各种问题,包括内存数据库和集群管理器。

设计思路

以下步骤来收集线程的堆栈跟踪:

找到正在运行的线程列表(T1,T2,T3)。这是通过让'/proc/self/task'目录的子目录完成的。

为每个线程分配一个内存插槽以写入其堆栈跟踪(M1,M2,M3)。请注意,从信号处理程序分配内存不是异步信号安全的,因此预先分配内存。

发送实时信号给每个发现的线程并等待他们的应答。相应的存储器插槽和ack文件描述符是实时信号有效负载的一部分。

线程的信号处理程序使用libunwind来计算它们的堆栈跟踪,并在各自的内存插槽中写入基于原始指令指针的堆栈跟踪。

在将堆栈跟踪写入指定的内存插槽后,每个线程都会通过管道回退到收集器线程。

在接收到所有acks(与步骤#1中检测到的线程数相同)后,收集器线程将对栈跟踪进行唯一化和符号化。

使用

进程可以链接到ThreadStacks库并安装'StackTraceSignal'类中定义的两个信号处理程序,以便能够实时检查其堆栈跟踪:

thoughtspot::StackTraceSignal::InstallInternalHandler()thoughtspot::StackTraceSignal::InstallExternalHandler()

 在安装了上述两个信号处理器之后,'StackTraceCollector'类可以用来收集堆栈跟踪,例如,来自REST处理程序。

构建

ThreadStacks使用bazel作为其构建系统,并依赖于'glog'、'gflags'和'googletests'项目作为远程bazel项目。

bazel build //threadstacks/...

测试:

bazel test //...
声明:本文仅代表作者观点,不代表本站立场。如果侵犯到您的合法权益,请联系我们删除侵权资源!如果遇到资源链接失效,请您通过评论或工单的方式通知管理员。未经允许,不得转载,本站所有资源文章禁止商业使用运营!
下载安装【程序员客栈】APP
实时对接需求、及时收发消息、丰富的开放项目需求、随时随地查看项目状态

评论