3

次のリンクからコードをコンパイルして、シグナルが生成されたときにバックトレースを出力しようとしています。

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

ありがとう、アーメド。

4

3 に答える 3

3

理解した。ucontext.h は signal.h からインクルードされ、インクルード時に __USE_GNU が定義されていないため、REG_RIP が定義されません。#include <ucontext.h>C ファイルに 追加しても効果はありませんでした。

#include <stdio.h>問題を解決した直後に「#define __USE_GNU」という行を追加しました。

#include <stdio.h>
#define __USE_GNU
#include <stdlib.h>
#include <signal.h>
#include <execinfo.h>

stdio.h には __USE_GNU を定義していない features.h が含まれているため、stdio.h の前に #define を追加しても役に立ちません。

助けてくれてありがとう。

于 2013-05-23T01:25:19.107 に答える
1

sys/ucontext.hあなたがそれに到達する前に、何か他のものが #includeされているのではないかと思います#include

ヘッダー ファイル ( ) の保護#ifndef _SYS_UCONTEXT_H, #define _SYS_UCONTEXT_Hにより、ヘッダー ファイルが複数回 #include されることを防ぎます。このファイルが の前に既にインクルードされている場合#define __USE_GNU、効果はありません。

#defineCファイルの先頭に移動するとコンパイルされますか?

于 2013-05-23T00:30:57.340 に答える
0

signal.hメインモジュールの早い段階で (__USE_GNU を定義する前に) 含まれています。これは問題ですか?

#define をメイン ファイルの先頭に移動するとどうなるでしょうか。

また、 __USE_GNU を自分で定義することについて:

_GNU_SOURCE および __USE_GNU

于 2013-05-23T00:30:45.823 に答える