簡體   English   中英

google-coredumper返回不允許的操作

[英]google-coredumper returns Operation not permitted

背景:從code.google.com下載google-coredumper-1.2.1.tar.gz。 構建代碼並進行安裝。 向我的應用程序添加了庫和函數調用並執行。 沒有核心文件,日志狀態不允許操作。 因此,我創建了一個簡單的示例並逐步進行了操作,發現該庫認為該可執行文件已被跟蹤。 有任何想法嗎?

#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;
}

練習的重點是,主代碼偶爾會產生分段錯誤,因為所有值都已初始化,所以這是沒有意義的。 因此,我試圖發現為什么存在分段錯誤,並希望獲得一個核心來跟蹤令人討厭的代碼行。 由於代碼需要恢復和繼續,因此我不能僅僅殺死它。 這就是為什么使用google-coredumper的原因。

根據http://www.gossamer-threads.com/lists/linux/kernel/622686的說法,目前處於狀態的coredumper似乎不再可用:

我相信,如果我正確解釋了kernel.org上的數據,那么此更改是Linus進行的,並隨2.6.15一起提供。

perftools和coredumper都需要在活動應用程序中定位所有線程才能工作。 由於libpthread擁有不斷變化的API和記錄較差的API來獲取此信息,並且由於我們的目的是支持所有內核版本和所有libc版本,因此我們訴諸於任何被懷疑是我們線程之一的進程,以確定其是否可用。實際上是。 這具有發現所有線程(包括不是由libpthread管理的線程)並暫時掛起它們的額外好處,因此我們擁有可以檢查的穩定內存映像。 可以將這兩種工具都視為輕量級的進程內調試器。

顯然,必須特別注意不要ptrace我們自己的線程,並避免任何可能導致死鎖的庫調用。

在補丁之前,將ptrace附加到我自己的線程是有效的操作。 有了這個新補丁,我將無法再這樣做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM