gpt4 book ai didi

c++ - 实现中断驱动的采样探查器

转载 作者:搜寻专家 更新时间:2023-10-31 00:35:35 24 4
gpt4 key购买 nike

我试图创建一个在Linux上运行的采样探查器,我不确定如何发送中断或如何获取程序计数器(pc),以便在中断程序时可以找出程序所在的位置。

我已经尝试过使用signal(SIGUSR1,Foo *)并调用backtrace,但是当我举起(SIGUSR1)而不是正在运行程序的线程时,我得到了我所在线程的堆栈。
我不确定这是否是正确的解决方法...

有什么建议吗?

最佳答案

您可以使用目标线程的pthread_kill和tid(gettid())将信号发送到特定线程。

创建简单的探查器的正确方法是使用 setitimer ,它可以每10毫秒发送一次周期性信号(SIGALRMSIGPROF);或posix计时器(timer_create,timer_settime或timerfd),而无需使用单独的线程来发送概要分析信号。检查google-perftools(gperftools)的来源,它们使用setitimer或posix计时器并使用回溯来收集配置文件。

gprof还使用setitimer来实现cpu时间分析(9.1 Implementation of Profiling-“Linux 2.0 ..已安排内核定期向过程发送信号(通常通过setitimer())”)。

例如:gperftools的来源中的setitimer的代码搜索结果:https://code.google.com/p/gperftools/codesearch#search/&q=setitimer&sq=package:gperftools&type=cs

void ProfileHandler::StartTimer() {
if (!allowed_) {
return;
}
struct itimerval timer;
timer.it_interval.tv_sec = 0;
timer.it_interval.tv_usec = 1000000 / frequency_;
timer.it_value = timer.it_interval;
setitimer(timer_type_, &timer, 0);
}

您应该知道setitimer的 forkclone存在问题;它不适用于多线程应用程序。有尝试创建辅助包装器的方法: http://sam.zoy.org/writings/programming/gprof.html(错误的一个),但是我没有 remember,它是否正常工作( setitimer通常发送进程范围的信号,而不是线程范围的信号)。 UPD:似乎自linux内核2.6.12起, setitimer's signal is directed to the process as whole(任何线程都可以得到它)。

要将信号从timer_create定向到特定线程,您需要 gettid()( #include <sys/syscall.h>syscall(__NR_gettid))和 SIGEV_THREAD_ID flag 。不要检查如何使用thread_create(可能是 timer_settime and non-zero it_interval)创建定期的posix计时器。

PS:Wikibooks中有一些概要分析: http://en.wikibooks.org/wiki/Introduction_to_Software_Engineering/Tools/Profiling

关于c++ - 实现中断驱动的采样探查器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23618743/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com