Hướng dẫn print stack trace c++ - in dấu vết ngăn xếp c ++

Tệp này chứa văn bản unicode hai chiều có thể được giải thích hoặc biên dịch khác với những gì xuất hiện dưới đây. Để xem xét, hãy mở tệp trong một trình soạn thảo cho thấy các ký tự Unicode ẩn. Tìm hiểu thêm về các ký tự unicode hai chiều

/***
* Tệp nguồn này được sử dụng để in ra một dấu vết ngăn xếp khi chương trình của bạn
* Segfaults. Nó tương đối đáng tin cậy và chính xác tại chỗ.
*
* Mã này nằm trong phạm vi công cộng. Sử dụng nó khi bạn thấy phù hợp, một số tín dụng
* Sẽ được đánh giá cao, nhưng không phải là điều kiện tiên quyết cho việc sử dụng. Nhận xét
* Việc sử dụng nó sẽ khuyến khích phát triển và bảo trì hơn nữa.
*
* Mã này nằm trong phạm vi công cộng. Sử dụng nó khi bạn thấy phù hợp, một số tín dụng
* Sẽ được đánh giá cao, nhưng không phải là điều kiện tiên quyết cho việc sử dụng. Nhận xét
*
* Mã này nằm trong phạm vi công cộng. Sử dụng nó khi bạn thấy phù hợp, một số tín dụng
* Sẽ được đánh giá cao, nhưng không phải là điều kiện tiên quyết cho việc sử dụng. Nhận xét
*
* Mã này nằm trong phạm vi công cộng. Sử dụng nó khi bạn thấy phù hợp, một số tín dụng
*
* Mã này nằm trong phạm vi công cộng. Sử dụng nó khi bạn thấy phù hợp, một số tín dụng
* Sẽ được đánh giá cao, nhưng không phải là điều kiện tiên quyết cho việc sử dụng. Nhận xét
* Việc sử dụng nó sẽ khuyến khích phát triển và bảo trì hơn nữa.ifndef _GNU_SOURCE
#define_GNU_SOURCEdefine _GNU_SOURCE
#endifendif
* Do lỗi trong GCC-4.x.x hiện tại bạn phải biên dịch là C ++ nếu bạn muốn Bug in gcc prevents from using CPP_DEMANGLE in pure "C" */
* Demangling để làm việc.if !defined(__cplusplus) && !defined(NO_CPP_DEMANGLE)
#defineNO_CPP_DEMANGLEdefine NO_CPP_DEMANGLE
#endifendif
#includeinclude <memory.h>
#includeinclude <stdlib.h>
#includeinclude <stdio.h>
#includeinclude <unistd.h>
#includeinclude <signal.h>
#includeinclude <ucontext.h>
#includeinclude <dlfcn.h>
* Xin lưu ý rằng nó đã được chuyển vào thư viện ULS của tôi, do đó việc kiểm traifndef NO_CPP_DEMANGLE
#includeinclude <cxxabi.h>
* HAS_ulslib và việc sử dụng macro SigSegV_outp dựa trên định nghĩa đó.ifdef __cplusplus
* Tác giả: Jaco Kroon
#endifendif
#endifendif
* Bản quyền (c) 2005 - 2010 Jaco Kroonifdef HAS_ULSLIB
#include"uls/logger.h"include "uls/logger.h"
*/define sigsegv_outp(x) sigsegv_outp(,gx)
#elseelse
#IFNDEF _GNU_SOURCEdefine sigsegv_outp(x, ...) fprintf(stderr, x "\n", ##__VA_ARGS__)
#endifendif
/ * Lỗi trong GCC ngăn không sử dụng cpp_demangle trong "C" *///if defined(REG_RIP)
#if! Đã xác định (__ cplusplus) &&! được xác định (no_cpp_demangle)define SIGSEGV_STACK_IA64
#IFNDEF NO_CPP_DEMANGLEdefine REGFORMAT "%016lx"
#ifdef __cpluspluselif defined(REG_EIP)
sử dụng __cxxabiv1 :: __ cxa_demangle;define SIGSEGV_STACK_X86
#ifdef has_ulslibdefine REGFORMAT "%08x"
#elseelse
#definesigsegv_outp (x) sigsegv_outp (, gx)define SIGSEGV_STACK_GENERIC
#definesigsegv_outp (x, ...)define REGFORMAT "%x"
#endifendif
#if xác định (reg_rip) void signal_segv(int signum, siginfo_t* info, void*ptr) {
# Xác địnhiGSEGV_STACK_IA64 const char *si_codes[3] = {"", "SEGV_MAPERR", "SEGV_ACCERR"};
# defineregformat "%016lx" i, f = 0;
#Elif được xác định (reg_eip) *ucontext = (ucontext_t*)ptr;
# Xác địnhiGSEGV_STACK_X86
# defineregformat "%08x" **bp = 0;
# Xác địnhiGSEGV_STACK_GENERIC *ip = 0;
# defineregformat "%x"("Segmentation Fault!");
staticvoidsignal_segv (int signum, siginfo_t* thông tin, void* ptr) {("info.si_signo = %d", signum);
staticConstchar *si_codes [3] = {"", "segv_maperr", "segv_accerr"};("info.si_errno = %d", info->si_errno);
int i, f = 0;("info.si_code = %d (%s)", info->si_code, si_codes[info->si_code]);
uContext_t *ucontext = (uContext_t *) ptr;("info.si_addr = %p", info->si_addr);
Dl_info dlinfo;(i = 0; i < NGREG; i++)
khoảng trống ** bp = 0;("reg[%02d] = 0x" REGFORMAT, i, ucontext->uc_mcontext.gregs[i]);
void *ip = 0;ifndef SIGSEGV_NOSTACK
sigsegv_outp ("lỗi phân đoạn!");if defined(SIGSEGV_STACK_IA64) || defined(SIGSEGV_STACK_X86)
sigsegv_outp ("info.si_signo = %d", signum);if defined(SIGSEGV_STACK_IA64)
sigsegv_outp ("info.si_errno = %d", thông tin-> si_errno);void*)ucontext->uc_mcontext.gregs[REG_RIP];
sigsegv_outp ("info.si_code = %d ( %s)", thông tin-> si_code, si_codes [info-> si_code]);void**)ucontext->uc_mcontext.gregs[REG_RBP];
sigsegv_outp ("info.si_addr = %p", thông tin-> si_addr);elif defined(SIGSEGV_STACK_X86)
for (i = 0; i void*)ucontext->uc_mcontext.gregs[REG_EIP];
sigsegv_outp ("reg [%02d] = 0x" regformat, i, ucontext-> uc_mcontext.gregs [i]);void**)ucontext->uc_mcontext.gregs[REG_EBP];
#endifendif
#IFNDEF SIGSEGV_NOSTACK sz;
#if được xác định (sigsegv_stack_ia64) || được xác định (sigsegv_stack_x86) syscom[256];
#if được xác định (sigsegv_stack_ia64) **bt = malloc(20 * sizeof(void *));
ip = (void*) uContext-> uc_mcontext.gregs [reg_rip];backtrace(bt, 20);
bp = (void **) ucontext-> uc_mcontext.gregs [reg_rbp]; (i=0; i < sz; i++){
#Elif được xác định (sigsegv_stack_x86) ( bt[i] < (void *)0x420000 && bt[i] > (void *)0x400000) {
ip = (void*) uContext-> uc_mcontext.gregs [reg_eip];(syscom,"addr2line %p -f -e tests",bt[i]);
bp = (void **) ucontext-> uc_mcontext.gregs [reg_ebp];(syscom);
int sz;
Char Syscom [256];
void ** bt = malloc (20 *sizeof (void *));("Stack trace:");
sz = backtrace (bt, 20);(bp && ip) {
for (i = 0; i (!dladdr(ip, &dlinfo))
break;
Sprintf (syscom, "addr2line %p -f -e kiểm tra", bt [i]); char *symname = dlinfo.dli_sname;
* Xin lưu ý rằng nó đã được chuyển vào thư viện ULS của tôi, do đó việc kiểm traifndef NO_CPP_DEMANGLE
* HAS_ulslib và việc sử dụng macro SigSegV_outp dựa trên định nghĩa đó. status;
* Tác giả: Jaco Kroon * tmp = __cxa_demangle(symname, NULL, 0, &status);
* Bản quyền (c) 2005 - 2010 Jaco Kroon (status == 0 && tmp)
*/
#endifendif
#IFNDEF _GNU_SOURCE("% 2d: %p <%s+%lu> (%s)",
/ * Lỗi trong GCC ngăn không sử dụng cpp_demangle trong "C" *///
#if! Đã xác định (__ cplusplus) &&! được xác định (no_cpp_demangle)
#IFNDEF NO_CPP_DEMANGLE
#ifdef __cplusplusunsigned long)ip - (unsigned long)dlinfo.dli_saddr,
sử dụng __cxxabiv1 :: __ cxa_demangle;dli_fname);
* Xin lưu ý rằng nó đã được chuyển vào thư viện ULS của tôi, do đó việc kiểm traifndef NO_CPP_DEMANGLE
* HAS_ulslib và việc sử dụng macro SigSegV_outp dựa trên định nghĩa đó. (tmp)
* Tác giả: Jaco Kroon(tmp);
#endifendif
* Bản quyền (c) 2005 - 2010 Jaco Kroon(dlinfo.dli_sname && !strcmp(dlinfo.dli_sname, "main"))
break;
Sprintf (syscom, "addr2line %p -f -e kiểm tra", bt [i]);1];
hệ thống (syscom);void**)bp[0];
int sz;
#elseelse
Char Syscom [256];("Stack trace (non-dedicated):");
void ** bt = malloc (20 *sizeof (void *));backtrace(bt, 20);
sz = backtrace (bt, 20);backtrace_symbols(bt, sz);
for (i = 0; i (i = 0; i < sz; ++i)
sigsegv_outp("%s", strings[i]);
#endifendif
Sprintf (syscom, "addr2line %p -f -e kiểm tra", bt [i]);("End of stack trace.");
#elseelse
hệ thống (syscom);("Not printing stack strace.");
#endifendif
} (-1);
Char Syscom [256];
void ** bt = malloc (20 *sizeof (void *)); void __attribute__((constructor)) setup_sigsegv() {
sz = backtrace (bt, 20); sigaction action;
for (i = 0; i (&action, 0, sizeof(action));
action.sa_sigaction = signal_segv;
Sprintf (syscom, "addr2line %p -f -e kiểm tra", bt [i]);sa_flags = SA_SIGINFO;
hệ thống (syscom);(sigaction(SIGSEGV, &action, NULL) < 0)
}("sigaction");
Char Syscom [256];