C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

gcc C ++プログラムがクラッシュしたときにスタックトレースを自動的に生成するにはどうすればよいですか?


Linuxの場合、gccを使用してC /C++コードをコンパイルできます。このコンパイラはglibcライブラリを使用します。 backtrace()関数を使用してエラーをトレースできます。この関数は、execinfo.hヘッダーファイル内にあります。この例では、スタックトレース機能を使用してセグメンテーション違反エラーを表示します。

#include <iostream>
#include <execinfo.h>
#include <signal.h>
#include <cstdlib>
#include <unistd.h>
using namespace std;
void error_handler(int sig) {
   void *array[10];
   size_t size;
   size = backtrace(array, 10); //get the void pointers for all of the entries
   cout << "Error: signal "<< sig <<":\n"; //display error signal
   backtrace_symbols_fd(array, size, STDERR_FILENO);
   exit(1);
}
void invalid_index() {
   int *ptr = (int*) - 1;
   cout << *ptr << endl; // segmentation error
}
void func1() {
   invalid_index();
}
void func2() {
   func1();
}
int main(int argc, char **argv) {
   signal(SIGSEGV, error_handler); // use handler to print the errors
   func2(); // this will call all other function to generate error
}

出力

Error: signal 11:
./a.out(+0x825)[0x5579a31d7825]
/lib/x86_64-linux-gnu/libc.so.6(+0x3ef20)[0x7f7689009f20]
./a.out(+0x880)[0x5579a31d7880]
./a.out(+0x8a1)[0x5579a31d78a1]
./a.out(+0x8ad)[0x5579a31d78ad]
./a.out(+0x8d5)[0x5579a31d78d5]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f7688fecb97]
./a.out(+0x71a)[0x5579a31d771a]

  1. C ++プログラムを使用してプログラムを起動するにはどうすればよいですか?

    ここでは、メモ帳などのサードパーティアプリケーションやC++プログラムを使用したものを起動する方法を説明します。このプログラムは非常に単純で、コマンドプロンプトコマンドを使用してこのタスクを実行できます。 system()関数内でアプリケーション名を渡します。これにより、それに応じて開きます。 例 #include <iostream> using namespace std; int main() {    cout >> "Opening Nodepad.exe" >> endl;    sy

  2. C ++で簡単なプログラムを作成する方法は?

    C ++で非常に単純なプログラムを取得するには、最初にそれを設定してから、そのプログラムを作成する必要があります。次の手順は、非常に単純なプログラムを使用してC++で開始する方法を示しています。 C++コンパイラを入手する これは、C++でのプログラミングの学習を開始する前に実行したい最初のステップです。すべての主要なOSプラットフォームで利用できる優れた無料のC++コンパイラがあります。プラットフォームに適したものをダウンロードするか、https://www.tutorialspoint.com/compile_cpp_online.phpでtutorialspoint.comのオンラインコ