次のリンクからコードをコンパイルして、シグナルが生成されたときにバックトレースを出力しようとしています。
http://www.linuxjournal.com/article/6391?page=0,1 (記事http://www.linuxjournal.com/files/linuxjournal.com/linuxjournal/articles/063/6391/6391l3.htmlから)
必要な変更を行いました (REG_EIP -> REG_RIP)。また、以下で説明する問題をデバッグするために、#include <ucontext.h>
「 」を「 」に変更しました。#include <sys/ucontext.h>
ファイルの先頭は次のとおりです。
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <execinfo.h>
/* get REG_EIP from ucontext.h */
#define __USE_GNU
#include <sys/ucontext.h>
...
コードをそのまま使用すると、次のエラーが発生します。
# gcc ./st2.c -rdynamic -o st2
./st2.c: In function ‘bt_sighandler’:
./st2.c:22: error: ‘REG_RIP’ undeclared (first use in this function)
./st2.c:22: error: (Each undeclared identifier is reported only once
./st2.c:22: error: for each function it appears in.)
ただし、次のように「#define __USE_GNU」行を「/usr/include/sys/ucontext.h」の先頭にコピーすると (これは非常に悪い考えであり、一時的なものであることがわかっています)、次のようになります。
#ifndef _SYS_UCONTEXT_H
#define _SYS_UCONTEXT_H 1
#define __USE_GNU
#include <features.h>
#include <signal.h>
#include <bits/wordsize.h>
............
#endif // _SYS_UCONTEXT_H
私のプログラムは正しくコンパイルされ、実行されます。
私のプログラムの #define がヘッダー ファイル "sys/ucontext.h" に "フロー" しない理由に困惑しており、#define を sys/ucontext.h に直接追加すると違いが生じます。どんな助けでも大歓迎です.j
ありがとう、アーメド。