문제는 누락 된 함수 선언되지 않습니다 (ISN : gdb를 세션에서 다음
double mysqrt(double x) { return sqrt(x) };
을 당신은 <math.h>
을 포함했기 때문에 실종되었습니다.)
실제로 사용하고있는 sqrt
에 대한 디버그 정보가 누락되었습니다. 디버그 정보가 없으면 GDB는 sqrt()
에 전달할 매개 변수 유형과 그 리턴 값에 대한 단서가 없습니다.
libc-debuginfo 패키지를 설치하면 많은 Linux 배포판에서 필요한 디버그 정보를 얻을 수 있습니다.
gdb -q ./a.out
Reading symbols from /tmp/a.out...done.
(gdb) b main
Breakpoint 1 at 0x400558: file t.c, line 6.
(gdb) r
Breakpoint 1, main() at t.c:6
6 printf("sqrt(3): %f\n", sqrt(3));
(gdb) p sqrt
$1 = {<text variable, no debug info>} 0x7ffff7b7fb50 <__sqrt>
참고 : 여기에 내가 이러한 시스템에 표시되는 내용입니다 "디버그 정보"
(gdb) p sqrt(3)
$2 = 0
(gdb) p sqrt(3.0)
$3 = 0
참고 : 당신의 행동과 일치합니다. 무엇 sqrt
기능 합니까 디버그 정보가 있습니까?
(gdb) info func sqrt
All functions matching regular expression "sqrt":
File ../sysdeps/x86_64/fpu/e_sqrt.c:
double __ieee754_sqrt(double);
File s_csqrt.c:
complex double __csqrt(complex double);
File ../sysdeps/x86_64/fpu/e_sqrtf.c:
float __ieee754_sqrtf(float);
File w_sqrtf.c:
float __sqrtf(float);
File s_csqrtf.c:
complex float __csqrtf(complex float);
File ../sysdeps/i386/fpu/e_sqrtl.c:
long double __ieee754_sqrtl(long double);
File w_sqrtl.c:
long double __sqrtl(long double);
File s_csqrtl.c:
complex long double __csqrtl(complex long double);
File ../sysdeps/ieee754/dbl-64/mpsqrt.c:
void __mpsqrt(mp_no *, mp_no *, int);
File w_sqrt.c:
double __sqrt(double);
(gdb) p __sqrt
$4 = {double (double)} 0x7ffff7b7fb50 <__sqrt>
참고 : __sqrt
가 sqrt
같은 주소이지만, GDB는 유형을 알고있다!
(gdb) p __sqrt(3)
$5 = 1.7320508075688772
(gdb) p __sqrt(3.0)
$6 = 1.7320508075688772
GDB의 버그라고 합리적으로 주장 할 수 있습니다. GDB bugzilla에 자유롭게 만드십시오.
이 결과를 얻으려면 사용중인 코드를 표시하십시오. – birryree
당신은''을 포함하고 있습니까? –
+1 예레미야, 내가 그 오류에 직면 해있는 오래된 나이를 기억합니다 :) –