如何获得有关c+中崩溃程序的信息+;用于将来的调试 我想知道当程序在C++中崩溃时,有什么方法可以获取一些信息。此信息可用于开发人员将来的调试。例如,此信息提供我的程序在哪一行代码和哪一个函数中崩溃,或者最好是为什么崩溃。

如何获得有关c+中崩溃程序的信息+;用于将来的调试 我想知道当程序在C++中崩溃时,有什么方法可以获取一些信息。此信息可用于开发人员将来的调试。例如,此信息提供我的程序在哪一行代码和哪一个函数中崩溃,或者最好是为什么崩溃。,c++,c++11,debugging,c++14,error-logging,windbg,C++,C++11,Debugging,C++14,Error Logging,Windbg,这个概念在Windows上称为崩溃转储,在Linux上称为核心转储。它不是C++的特性,而是操作系统的特性。它适用于编译为本机汇编程序指令的代码(对于C++来说通常是这样) 崩溃时崩溃程序的状态将被保存,因此您可以查看调用堆栈、内存、寄存器等。可以配置信息量。然后在调试器的帮助下(例如在Windows上)完成分析 对于行号,请注意将符号与二进制文件一起构建。为了进行分析,您需要将崩溃转储与正确的符号结合起来,以获得行号。这个概念在Windows上称为崩溃转储,在Linux上称为核心转储。它不是C

这个概念在Windows上称为崩溃转储,在Linux上称为核心转储。它不是C++的特性,而是操作系统的特性。它适用于编译为本机汇编程序指令的代码(对于C++来说通常是这样)

崩溃时崩溃程序的状态将被保存,因此您可以查看调用堆栈、内存、寄存器等。可以配置信息量。然后在调试器的帮助下(例如在Windows上)完成分析

对于行号,请注意将符号与二进制文件一起构建。为了进行分析,您需要将崩溃转储与正确的符号结合起来,以获得行号。

这个概念在Windows上称为崩溃转储,在Linux上称为核心转储。它不是C++的特性,而是操作系统的特性。它适用于编译为本机汇编程序指令的代码(对于C++来说通常是这样)

崩溃时崩溃程序的状态将被保存,因此您可以查看调用堆栈、内存、寄存器等。可以配置信息量。然后在调试器的帮助下(例如在Windows上)完成分析

对于行号,请注意将符号与二进制文件一起构建。为了进行分析,您需要将崩溃转储与正确的符号组合在一起,以获得行号

如何获取C++中的崩溃程序的信息,用于调试< /P> 这是特定于实现的。 (在实践中,编译器特定和特定;我的观点是中心的)

C++11是一种编程语言,由用英语编写的规范()定义。它不是一个软件。 <>通常使用一些编译C++代码。我建议使用或的最新版本。如果你使用它,编译你的C++代码所有警告和调试信息,至少是<代码> G++-WALT-WOTH-G 或<代码> CLAN++WALL-WOTH-G。一些编译器能够在发出调试信息时进行优化(例如,您可以运行
g++-Wall-Wextra-g-Og
,就像我们在中所做的那样)。有时你也可以用C++工具或类似的C++程序生成(C++的程序)。 <>你用调试信息编译你的C++代码(也许也使用了一个构建自动化工具),你可以(至少在Linux上)使用调试器。因为您可以处理转储(请参阅)

当然,如果你正在C++中编写一个操作系统(就像一个),事情就不同了。

如何获取C++中的崩溃程序的信息,用于调试< /P> 这是特定于实现的。 (在实践中,编译器特定和特定;我的观点是中心的)

C++11是一种编程语言,由用英语编写的规范()定义。它不是一个软件。 <>通常使用一些编译C++代码。我建议使用或的最新版本。如果你使用它,编译你的C++代码所有警告和调试信息,至少是<代码> G++-WALT-WOTH-G 或<代码> CLAN++WALL-WOTH-G。一些编译器能够在发出调试信息时进行优化(例如,您可以运行
g++-Wall-Wextra-g-Og
,就像我们在中所做的那样)。有时你也可以用C++工具或类似的C++程序生成(C++的程序)。 <>你用调试信息编译你的C++代码(也许也使用了一个构建自动化工具),你可以(至少在Linux上)使用调试器。因为您可以处理转储(请参阅)


<>当然,如果你正在C++中编写一个操作系统(就像一个),事情就不同了。

不减去上面所说的,我认为你需要建立一个信号处理程序,它可以在代码被压碎的地方执行回溯。诸如此类

void signalHandler(int signal)
{
    void *array[500];
    size_t size;

    // get void*'s for all entries on the stack
    size = backtrace(array, 500);
    // print out all the frames to stderr
    
    fprintf(stderr, "Error: signal %d:\n", signal);
    backtrace_symbols_fd(array, size, STDERR_FILENO);
    exit(1);
}


void registerSignalHandler()
{
    signal(SIGSEGV, signalHandler);
}

int main(int argc, char* argv[])
{

    registerSignalHandler();
    
   // your code 
   return 1;
}

在不影响上述内容的情况下,我认为您需要构建一个信号处理程序,它可以执行回溯到代码中它被压碎的地方。诸如此类

void signalHandler(int signal)
{
    void *array[500];
    size_t size;

    // get void*'s for all entries on the stack
    size = backtrace(array, 500);
    // print out all the frames to stderr
    
    fprintf(stderr, "Error: signal %d:\n", signal);
    backtrace_symbols_fd(array, size, STDERR_FILENO);
    exit(1);
}


void registerSignalHandler()
{
    signal(SIGSEGV, signalHandler);
}

int main(int argc, char* argv[])
{

    registerSignalHandler();
    
   // your code 
   return 1;
}

google::InstallFailureSignalHandler()
可以为我们提供信息。它还自动打印调用堆栈。 它很容易使用。 有关更多信息,请参阅

google::InstallFailureSignalHandler()
可以为我们提供信息。它还自动打印调用堆栈。 它很容易使用。 有关更多信息,请参阅

您可能正在寻找崩溃转储(在Windows上,有时称为“迷你转储”)。它们可用于捕获应用程序的状态,并允许您在以后对其进行调试(包括内存、堆栈跟踪、异常)。看看breakpad()库,您可能正在寻找崩溃转储(在Windows上,有时称为“迷你转储”)。它们可用于捕获应用程序的状态,并允许您在以后对其进行调试(包括内存、堆栈跟踪、异常)。看看breakpad()library.BTW,这里是我的Windows操作系统概述文章:顺便说一句,这里是我的Windows操作系统概述文章: