2

Windows で使用するコードをいくつか作成しまし__debugbreak()たが、他のコンパイラをサポートしたいので、この関数 (Clang および GCC) のより移植性の高いバージョンを作成しようとしています。

デバッグ ブレークを指定するターゲットに依存しない手段が提供されないため、今のところインライン アセンブラの使用を拒否しました。私も見まし__builtin_trap()たが、たとえば、後でステップイン/ステップオーバーするなど、そのようなことは実際には許可されていないようです。私もこの質問を見てきましたが、受け入れられた回答では、探しているビット、つまり「...」に入るビットが実際には指定されていません。

これをサポートすることに関する Clang のパッチもいくつか見ましたが、どうやら Clang は依然として を含むコードを拒否しているようです__debugbreak()

助言がありますか?

4

1 に答える 1

4

__builtin_trap()gcc で続行するための適切なタイプのブレークポイントが得られないことを確認できます。これはillegal opcode trap、コードをまったく続行できない を提供しますnext。gdb で実行すると、 で終了するだけSIGILLです。これは、実際に続行できるようにしたい場合は特に有益ではありません。

私が見る限り、唯一の解決策はインライン アセンブラを使用することです。int 3「hello, world」プログラムでを使用してみましたgdbが、ブレークポイントは認識されませんでしたが、命令で停止し、ブレーク後に続行できました。

#include <stdio.h>

#define BREAKPOINT \
    asm("int $3")

int main()
{

    BREAKPOINT;

    printf("Hello, world!\n");
    return 0;
}

(Linux x86_64、32 ビット モードと 64 ビット モードの両方で gcc と clang の両方でコンパイル)

私はこのブログを見つけました: http://mainisusuallyafunction.blogspot.co.uk/2012/01/embedding-gdb-breakpoints-in-c-source.html

ただし、実行可能ファイルを解析するスクリプトが必要です (また、Windows ではまったく機能しない可能性があります)。

于 2013-07-07T22:28:14.397 に答える