37

評価関数がgdbで機能しないのはなぜですか?私が含めたソースファイルに、gdbでデバッグする場合、これらの例は間違った評価です。

(gdb) p pow(3,2)

$10 = 1

(gdb) p pow(3,3)

$11 = 1

(gdb) p sqrt(9)

$12 = 0
4

5 に答える 5

30

パラメータに適切なタイプを与えることに加えて、通常のレジスタではなく浮動小数点レジスタで戻り値を検出することをgdbに通知する必要があります。

すなわち:

(gdb)p((double(*)())pow)(2.、2。)

$ 1 = 4

于 2012-11-15T13:30:38.877 に答える
28

gdbで関数を呼び出すための構文は次のとおりです。

call pow(3,2)

タイプ

help call

詳細については、gdbプロンプトで。

于 2009-08-30T20:03:06.317 に答える
20

私の推測では、コンパイラとリンカはこれらの特定の機能を使って魔法をかけます。パフォーマンスを向上させる可能性が最も高いです。

どうしてもpow()gdbで使用可能にする必要がある場合は、独自のラッパー関数を作成できます。

double mypow(double a, double b)
{
    return pow(a,b);
}

たぶん、それを#ifdef DEBUG何かにラップして、最終的なバイナリを乱雑にしないようにします。

ところで、他のライブラリ関数を呼び出すことができる(そしてそれらの戻り値を出力する)ことができます。たとえば、次のようになります。

(gdb) print printf("hello world")
$4 = 11
于 2009-08-30T20:17:03.340 に答える
5

実際、少なくともgccの私のLINUX実装では、数学関数の多くは、math.hおよびbits / mathcalls.h(math.h内から含まれる)によって引き込まれたいくつかの派手な置換を介して、引数のタイプに固有のバリアントに置き換えられます。 )。結果として、powやexpなどの関数は代わりに__powまたはとして呼び出され*__GI___expます(結果は引数のタイプおよびおそらく特定のバージョンによって異なる場合があります)。

コードにリンクされている関数が正確に何であるかを識別するために、その関数だけが呼び出される行にブレークを入れます。たとえば、コードにb=exp(c);。次に、そのブレークポイントまでgdbで実行し、「step」コマンドを使用してその行からの呼び出しを入力します。次に、「where」コマンドを使用して、呼び出されたルーチンの名前を識別できます。私の場合、それはでした*__GI___exp

この情報を取得するための賢い方法はおそらくありますが、プリプロセッサを単独で実行する(-Eオプション)か、生成されたアセンブリコード(-s)を確認するだけでは、正しい名前を見つけることができませんでした。

于 2012-01-10T14:53:52.970 に答える
1
NAME
   pow, powf, powl - power functions

SYNOPSIS
   #include <math.h>

   double pow(double x, double y);

doubleの代わりにintを渡してはいけません

 call pow( 3. , 2. )

また、1つの引数を渡すだけでは不十分であり、関数が期待するのと同じように2つの引数が必要です。

 wrong: call pow ( 3. )
于 2009-08-30T20:16:21.767 に答える