Tag: gdb

gdb在使用math.h函数时给出奇怪的输出

可能重复: 为什么gdb将sqrt(3)评估为0? C新手在这里。 当尝试在线使用math.h函数时,必须有一个明显的解释为什么gdb会给出奇怪的输出。 例如,下面的fabs函数应该取绝对值,并返回一个double。 (gdb) p cos(2*3.141/4) $13 = 1073291460 (gdb) p fabs(-3) $14 = 0 (gdb) p fabs(3) $15 = 0 (gdb) p fabs(3.333) $16 = 1 (gdb) p (double) fabs(-3.234) $17 = 1 (gdb) p (double) fabs((double)-3.234) $18 = 1 (gdb) p ((double(*)(double))fabs)(-3) $19 = 682945 我正在使用的代码包括math.h,并且实际代码似乎正确执行,尽管在gdb中内嵌的相同代码会产生奇怪的结果。 我可以忽略它,但这似乎是一个很好的学习机会。

是否可以找到分配给指针的内存,而无需搜索malloc语句

假设我已经为函数foo某个指针分配了内存: void foo() { // … int *ptr = malloc(20*sizeof(int)); bar (ptr); } 从foo() ,我将这个指针传递给bar() ,让我们从bar()到另一个函数。 现在,在某个时间点,我想检查:为指针分配了多少内存。 有没有可能的方法,没有搜索声明: int *ptr = malloc(20*sizeof(int)); 使用GDB计算出为指针分配了多少内存? 谢谢。

在gdb中包含malloc.c的源代码?

如何在gdb中包含/查看malloc的源代码? 我想在gdb逐步执行,并在调用任何malloc函数时进入malloc.c源代码。 目前gdb所说的是: malloc.c: No such file or directory. 这个人在这里遇到了同样的问题,但他们没有提到解决方案,即如何实际进入malloc的源代码。 我在Ubuntu server 14.04 ,我已经尝试安装以下软件: libc6-dbg , libc6-dev和libc6-dbgsym 。 我甚至不知道其中一个软件包是否有帮助,但是安装libc-dbgsym会给我带来以下错误: dpkg: error processing archive /var/cache/apt/archives/libc6-dbgsym_2.19-0ubuntu6.6_amd64.ddeb (–unpack): trying to overwrite ‘/usr/lib/debug/usr/lib/x86_64-linux-gnu/audit/sotruss-lib.so’, which is also in package libc6-dbg:amd64 2.19-0ubuntu6.6 dpkg-deb: error: subprocess paste was killed by signal (Broken pipe)

如何在gdb中的fork()之后调试子进程?

调用fork后,当前进程将调用exit(0) 。 但孩子会继续。 switch(fork()) { case -1: exit(1); case 0: //child process,continue break; default: //the current process,exit exit(0); } 在这种情况下,如何继续调试子进程?

fork之后调试子进程(跟随fork-mode子配置)

我正在开发一个应用程序,父母要求孩子处理某些任务。 我遇到了一个问题,我已经将gdb配置为follow-fork-mode子,但是在fork之后,在到达断点之后,它发送了一个SIGTRAP,但是孩子以某种方式终止并将SIGCHLD发送给父服务器。 我已经在fork之前配置了signal(SIGTRAP, SIG_IGN) ,所以我的理解是,当达到断点但是它没有发生时,孩子应该inheritance并忽略SIGTRAP。 如果我不对,请帮助我理解这一点。 如何成功调试子进程?

是否可以在GDB调试器中“跳转”/“跳过”?

在GDB中调试时是否可以跳转到代码/可执行文件中的某个位置/地址? 假设我有类似以下的内容 int main() { caller_f1() { f1(); // breakpoint f2() } // want to skip f2() and jump caller_f2() { // jump to this this location ?? f1(); f2(); } }

无法使用GDB进入string.h函数

无法在GDB 7.5中单步执行string.h 。 这是一个简单的示例程序: 源代码: #include #include int main() { char str1[20]; strcpy(str1, “STEP INTO ME\n”); printf(str1); } 编译: ~$ gcc -g foo.c 调用: ~$ gdb -q ./a.out GDB: (gdb) break 5 Breakpoint 1 at 0x8048471: file foo.c, line 6. (gdb) break strcpy Function “strcpy” not defined. Make breakpoint pending on future shared library load? […]

如何使用gdb调试?

我试图在我的程序中添加一个断点 b {line number} 但我总是得到一个错误,上面写着: No symbol table is loaded. Use the “file” command. 我该怎么办?

为什么gdb将sqrt(3)评估为0?

由Wolfram Alpha估算的3的平方根: 1.7320508075688772935274463415058723669428052538103806280558… 当我在C中执行sqrt(3)时,它的计算结果为0.为什么? 编辑4 :这是你如何在GDB中重现这个问题。 创建test.c如下: #include #include int main() { printf(“sqrt(3): %f\n”, sqrt(3)); return 0; } 编译: gcc -O0 -g -Wall -pedantic -ansi -lm -o test test.c 运行调试器: gdb test 在控制台输入: (gdb) break test.c:6 Breakpoint 1 at 0x400578: file test.c, line 6. (gdb) r Starting program: /home/pdedecker/Desktop/test Breakpoint 1, main () at test.c:6 […]

从调用堆栈中获取函数名称

我正在开发一个调用本机代码的Android程序。 该本机代码是segfaulting,因为通过android NDK进行调试并不是真的可行,所以我留下了一个如下所示的callstack(从ddms中捕获)。 我的问题是,在将callstack中的内存地址转换为函数名之后是否可以手动运行,以便我可以看到这是segfaulting的位置。 谢谢 02-22 14:47:39.231: DEBUG/dalvikvm(504): Trying to load lib /data/data/android.TestApp/lib/libDM.so 0x43b7c938 02-22 14:47:39.301: DEBUG/dalvikvm(504): Added shared lib /data/data/android.TestApp/lib/libDM.so 0x43b7c938 02-22 14:47:39.310: DEBUG/dalvikvm(504): No JNI_OnLoad found in /data/data/android.TestApp/lib/libDM.so 0x43b7c938 02-22 14:47:39.406: DEBUG/dalvikvm(504): +++ not scanning ‘/system/lib/libwebcore.so’ for ‘onLoadModel’ (wrong CL) 02-22 14:47:39.410: DEBUG/dalvikvm(504): +++ not scanning ‘/system/lib/libmedia_jni.so’ for ‘onLoadModel’ (wrong CL) 02-22 14:47:39.410: […]