C++ 不允许google coredumper返回操作
背景:从code.google.com下载google-coredumper-1.2.1.tar.gz。生成代码并进行安装。为我的应用程序和执行添加了库和函数调用。无核心文件,不允许日志状态操作。因此,我创建了一个简单的示例,并对其进行了深入研究,发现库认为已在跟踪可执行文件。有什么想法吗C++ 不允许google coredumper返回操作,c++,C++,背景:从code.google.com下载google-coredumper-1.2.1.tar.gz。生成代码并进行安装。为我的应用程序和执行添加了库和函数调用。无核心文件,不允许日志状态操作。因此,我创建了一个简单的示例,并对其进行了深入研究,发现库认为已在跟踪可执行文件。有什么想法吗 #include <string> #include <stdio.h> #include <stdlib.h> #include "crashtest.h" #inclu
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include "crashtest.h"
#include <google/coredumper.h>
#include <errno.h>
#include <string.h>
#include <signal.h>
FILE * backtrace_file = NULL;
#define SIZE 100
void CREATE_COREDUMP()
{
printf("NOTICE, Creating a core dump for debugging\n");
char extension[64];
time_t t = time((time_t*)NULL);
tm * theTime = localtime(&t);
snprintf( extension,
sizeof(extension) - 1,
"core.crashtest_02d_%02d_%02d_%02d", (theTime->tm_mday),
(theTime->tm_hour),
(theTime->tm_min) ,
(theTime->tm_sec) );
if (WriteCoreDump(extension) != 0) {
std::string errmsg(extension);
errmsg.append(" : ");
errmsg.append(strerror(errno));
printf("WARNING, Failed to create coredump: %s\n", errmsg.c_str() );
}
}
static void mysighandler(int sig)
{
printf("ERROR, Somebody Segmentation Faulted. About to Exit\n");
CREATE_COREDUMP();
exit(0);
}
crashtest::crashtest() {
char * errcond = NULL;
memcpy(errcond, "Crash This", 10);
}
crashtest::~crashtest() {}
int main(int argc, char** argv) {
struct sigaction sa;
sa.sa_flags = SA_SIGINFO;
sigemptyset(&sa.sa_mask);
sa.sa_handler = &mysighandler;
sigaction(SIGSEGV, &sa, NULL);
crashtest ct;
return 0;
}
#包括
#包括
#包括
#包括“crashtest.h”
#包括
#包括
#包括
#包括
FILE*backtrace_FILE=NULL;
#定义大小100
void CREATE_COREDUMP()
{
printf(“注意,为调试创建核心转储\n”);
字符扩展[64];
time\u t=时间((time\u t*)空值);
tm*theTime=本地时间(&t);
snprintf(扩展,
sizeof(扩展)-1,
“core.crashtest_02d_u%02d_%02d_%02d”,(时间->tm\mday),
(时间->tm_小时),
(时间->tm_min),
(时间->tm_秒);
if(WriteCoreDump(扩展)!=0){
std::字符串errmsg(扩展名);
errmsg.append(“:”);
errmsg.append(strerror(errno));
printf(“警告,未能创建coredump:%s\n”,errmsg.c_str());
}
}
静态void mysighandler(int-sig)
{
printf(“错误,出现故障。即将退出\n”);
创建_COREDUMP();
出口(0);
}
crashtest::crashtest(){
char*errcond=NULL;
memcpy(errcond,“Crash This”,10);
}
crashtest::~crashtest(){}
int main(int argc,字符**argv){
struct-sigaction-sa;
sa.sa_flags=sa_SIGINFO;
sigemptyset(和sa.sa_面具);
sa.sa_handler=&mysighandler;
sigaction(SIGSEGV,&sa,NULL);
粗测ct;
返回0;
}
练习的要点是,主代码偶尔会生成一个分段错误,这是没有意义的,因为所有值都已初始化。因此,我试图发现为什么会出现分段错误,并希望获得一个核心来跟踪有问题的代码行。我不能只是杀戮,因为恢复和继续需要代码。这就是人们认为使用google coredumper的原因。根据,coredumper在其当前状态下似乎不再可用:
我相信,如果我正确解释kernel.org上的数据,这
更改由Linus完成,并随2.6.15一起发货
perftools和coredumper都需要定位活动线程中的所有线程
为了工作而申请。由于libpthread已经发生了更改和
没有很好的文档化API来获取这些信息,正如我们的意图所示
为了支持所有内核版本和所有libc版本,我们求助于
ptracing任何被怀疑是中的线程之一的进程
以确定它是否真的是。这样做的另一个好处是
查找所有线程(包括未由libpthread管理的线程)和
暂时挂起它们,这样我们就有了一个稳定的内存映像
我们可以检查。将这两种工具都视为
轻量级进程内调试器
显然,我们必须特别小心,不要让我们自己的线程,
并避免任何可能导致死锁的库调用
在补丁之前,将ptrace附加到我自己的线程是一种有效的方法
活动有了这个新补丁,我再也做不到了
根据,coredumper在其当前状态下似乎不再可用:
我相信,如果我正确解释kernel.org上的数据,这
更改由Linus完成,并随2.6.15一起发货
perftools和coredumper都需要定位活动线程中的所有线程
为了工作而申请。由于libpthread已经发生了更改和
没有很好的文档化API来获取这些信息,正如我们的意图所示
为了支持所有内核版本和所有libc版本,我们求助于
ptracing任何被怀疑是中的线程之一的进程
以确定它是否真的是。这样做的另一个好处是
查找所有线程(包括未由libpthread管理的线程)和
暂时挂起它们,这样我们就有了一个稳定的内存映像
我们可以检查。将这两种工具都视为
轻量级进程内调试器
显然,我们必须特别小心,不要让我们自己的线程,
并避免任何可能导致死锁的库调用
在补丁之前,将ptrace附加到我自己的线程是一种有效的方法
活动有了这个新补丁,我再也做不到了
调试器确实跟踪程序,所以库的信念是正确的。恐怕这与“不允许操作”无关。检查
ulimit-c
的输出,如果为0,则将其设置为合理值。核心转储已启用。我在调试器标记的位置放了一条print语句,即使没有单步执行代码,也会打印出这一行。似乎有另一个对象跟踪线程。调试器确实跟踪程序,所以库的想法是正确的。恐怕这与“不允许操作”无关。检查ulimit-c
的输出,如果为0,则将其设置为合理值。核心转储已启用。我在调试器标记的位置放了一条print语句,即使没有单步执行代码,也会打印出这一行。似乎有另一个对象在跟踪线程。