Интересно, почему оценка функции не работает в gdb? В моем исходном файле я включаю, при отладке в gdb эти примеры являются неправильными оценками.
(gdb) p pow(3,2)
$10 = 1
(gdb) p pow(3,3)
$11 = 1
(gdb) p sqrt(9)
$12 = 0
Интересно, почему оценка функции не работает в gdb? В моем исходном файле я включаю, при отладке в gdb эти примеры являются неправильными оценками.
(gdb) p pow(3,2)
$10 = 1
(gdb) p pow(3,3)
$11 = 1
(gdb) p sqrt(9)
$12 = 0
Я предполагаю, что компилятор и компоновщик делают некоторые магии с этими конкретными функциями. Скорее всего, повысит производительность.
Если вам действительно нужно pow()
быть доступным в gdb, тогда вы можете создать свою собственную функцию-обертку:
double mypow(double a, double b)
{
return pow(a,b);
}
Может быть, также обернуть его в #ifdef DEBUG
или что-то, чтобы не загромождать окончательный двоичный файл.
BTW, вы заметите, что могут быть вызваны другие функции библиотеки (и их возвращаемое значение), например:
(gdb) print printf("hello world")
$4 = 11
Вам нужно сообщить gdb, что он найдет возвращаемое значение в регистры с плавающей запятой, а не обычные, в дополнение к тому, чтобы дать параметрам правильные типы.
то есть:.
(gdb) p ((double (*)()) pow) (2., 2.)
$1 = 4
Синтаксис вызова функции в gdb
call pow(3,2)
Введите
help call
в приглашении gdb для получения дополнительной информации.
На самом деле, по крайней мере, в моей LINUX-реализации gcc многие математические функции заменяются вариантами, специфичными для типов их аргументов, через некоторые причудливые замены, вытащенные math.h и bits/mathcalls.h(включены изнутри math.h). Как следствие, функции, такие как pow и exp, называются вместо __pow
или *__GI___exp
(ваши результаты могут различаться в зависимости от типов аргументов и, возможно, конкретной версии).
Чтобы определить, какая именно функция связана с моим кодом, я помещаю разрыв в строку, где вызывается только эта функция, например. в моем коде есть строка с b=exp(c);
. Затем я запускаю gdb до этой точки останова, а затем использую команду "step" для ввода вызова из этой строки. Затем я могу использовать команду "where", чтобы идентифицировать имя вызываемой процедуры. В моем случае это было *__GI___exp
.
Есть, вероятно, более умные способы получить эту информацию, однако я не смог найти правильное имя, просто выполнив только препроцессор (параметр -E) или посмотрев на сгенерированный код сборки (-s).
pow определяется как макрос, а не как функция. Вызов в gdb может вызывать только функции в вашей программе или в общей библиотеке. Таким образом, вызов pow в gdb не удался.
(gdb) p pow(3,2)
No symbol "pow" in current context.
здесь приведенный gcc двоичный код источника вызова pow (int, int):
(gdb) list
1 int main() {
2 int a=pow(3,2);
3 printf("hello:%d\n", a);
4 }
(gdb) x/16i main
0x4004f4 <main>: push %rbp
0x4004f5 <main+1>: mov %rsp,%rbp
0x4004f8 <main+4>: sub $0x10,%rsp
0x4004fc <main+8>: movl $0x9,-0x4(%rbp)
=> 0x400503 <main+15>: mov -0x4(%rbp),%eax
0x400506 <main+18>: mov %eax,%esi
0x400508 <main+20>: mov $0x40060c,%edi
0x40050d <main+25>: mov $0x0,%eax
0x400512 <main+30>: callq 0x4003f0 <[email protected]>
0x400517 <main+35>: leaveq
0x400518 <main+36>: retq
0x400519: nop
0x40051a: nop
0x40051b: nop
0x40051c: nop
0x40051d: nop
здесь приведенный gcc двоичный код источника вызова pow (float, float):
(gdb) list
1 int main() {
2 double a=pow(0.3, 0.2);
3 printf("hello:%f\n", a);
4 }
(gdb) x/16i main
0x4004f4 <main>: push %rbp
0x4004f5 <main+1>: mov %rsp,%rbp
0x4004f8 <main+4>: sub $0x10,%rsp
0x4004fc <main+8>: movabs $0x3fe926eff16629a5,%rax
0x400506 <main+18>: mov %rax,-0x8(%rbp)
0x40050a <main+22>: movsd -0x8(%rbp),%xmm0
0x40050f <main+27>: mov $0x40060c,%edi
0x400514 <main+32>: mov $0x1,%eax
0x400519 <main+37>: callq 0x4003f0 <[email protected]>
0x40051e <main+42>: leaveq
0x40051f <main+43>: retq
NAME
pow, powf, powl - power functions
SYNOPSIS
#include <math.h>
double pow(double x, double y);
Вы не должны передавать int вместо двойного
call pow( 3. , 2. )
Кроме того, передача одного аргумента недостаточно, вам нужны два аргумента, как функция ожидает
wrong: call pow ( 3. )