Tag: 调试

为什么malloc分配的字节数与请求的数量不同?

我有这段代码 #include #include #include #include int main(){ void *a, *b; a = malloc(16); b = malloc(16); printf(“\n block size (for a): %p-%p : %li”, b, a, ba); a = malloc(1024); b = malloc(1024); printf(“\n block size (for a): %p-%p : %li”, b, a, ba); } 这不应该打印最后分配的块大小(16或1024)? 它反而打印24和1032,因此分配的内存量似乎有8个额外的字节。 我的问题是(在进行这个测试用例之前)我在一个函数(1024字节)中执行malloc() ),并返回分配的结果。 在函数返回时检查块大小时,我得到了516个块……我不明白为什么。 我想这可能是在对分配的缓冲区进行一些处理后发生内存损坏的原因:) 编辑:我已经看过如何从C中的指针获取数组的大小? 似乎问了同样的事情,抱歉重新发布。 我已将我的示例重新编写为更具体的代码: #include […]

GDB说“没有符号表”,但nm显示文件有调试符号

我正在尝试使用GDB调试一个简单的C项目,但无论我如何编译它,GDB似乎都找不到该程序的调试符号。 当我将程序加载到GDB时,它声称已成功读取符号,因为它打印 Reading symbols from /home/edward/…done. 但是,当我运行程序时,打破分段错误,并输入info locals ,它说 No symbol table info available. 另外, bt表明执行在我写的函数(不是系统或库调用)中停止,但是没有行号信息,只有原始内存地址。 为什么GDB不能找到或使用之前成功读取的符号? 我在我正在运行的二进制文件上运行nm和objdump ,它们都显示了.debug_info , .debug_line等部分,因此该文件确实包含调试符号。 我通常使用Makefile编译,设置以下标志: CFLAGS = -mno-red-zone -fno-omit-frame-pointer -ggdb -O0 -I. -Wdeclaration-after-statement -Wall 当我调用gcc时,我可以看到它被使用。 但是,我尝试更改为-g ,并通过在简单的测试文件上调用gcc -g -O0手动编译,结果仍然相同:二进制文件包含调试符号,GDB读取它们,但调用任何GDB命令都会产生一条消息,指出调试信息不​​可用。 更新 我正在运行Ubuntu 12.04,我的GDB版本是7.4,而我的GCC版本是4.8.1。 如果我在GDB中set complaints 10000然后加载文件,它会打印以下投诉: Reading symbols from /home/edward//minithread… DW_AT_low_pc 0x400690 is not < DW_AT_high_pc 0x33 for DIE […]

如何让gdb以hex模式打印出所有值?

默认情况下,gdb始终打印/显示基数为10的所有变量/参数。有什么方法可以让gdb在打印任何内容时始终使用base 16(当我不需要时返回默认设置)? 我知道它可以通过提供打印/显示的’/ x’参数来打印,但我不想每次都这样做….

在调用函数时使GDB打印控制流程

如何调用感兴趣的gdb打印函数,根据堆栈的深度缩进? 我希望能够说出(制作): (gdb) trace Foo* Bar* printf 并让gdb打印所有以Foo或Bar开头的函数,因为它们被调用。 有点像gnu cflow,除了使用调试符号和仅实际调用的打印函数,而不是所有可能的调用流。 无法帮助的工具包括cachegrind,callgrind和oprofile,它们最常调用函数的结果。 我需要保留的调用顺序。 通配符(或等效的)是必不可少的,因为有很多Foo和Bar函数。 虽然我愿意完全记录所有function。 或者,也许告诉gdb记录特定库中的所有函数。 某些GDB向导必须有一个用于此常见作业的脚本!

GDB在linux中使用coredump文件

我刚刚在linux中获得了一个core-dump文件 ulimit -c unlimited 我该如何附加gdb 我需要给它命令行参数。 样本执行: ./my_prog arg 帮我进入gdb 干杯!!

在鹅卵石手表上记录枚举

当我在Pebble上记录错误时,如下所示: static void message_dropped(AppMessageResult reason, void *context) { APP_LOG(APP_LOG_LEVEL_DEBUG, “Message dropped. Reason: %d”, reason); } 我只是得到错误消息的int值。 是否有一种简单的方法来记录枚举的文本? 喜欢: static void message_dropped(AppMessageResult reason, void *context) { APP_LOG(APP_LOG_LEVEL_DEBUG, “Message dropped. Reason: %fancy”, reason); } // Would return “APP_MSG_BUFFER_OVERFLOW”

GDB:自动’下一步’?

这一次很快。 是否有可能(除了永远按下输入)gdb不断地通过一个程序一行一行地找到错误发生的位置? 编辑: continue不是我想要的; 我想有效地看到完整的程序执行,一行一行,就像你从next反复获得的那样。

C编程:使用pthreads进行调试

我最初调整到的最困难的事情之一就是我第一次使用C语言编写C语言的强烈经验。我习惯于确切知道下一行代码的运行方式是什么,而且我的大多数调试技术都围绕着这种期望。 在C中用pthreads调试有哪些好的技巧? 您可以建议个人方法,无需任何添加工具,使用的工具或任何其他有助于您调试的方法。 PS我在linux中使用gcc进行C编程,但不要让它限制你的答案

有关动态代码分析的任何参考?

昨天我正在阅读有关调试技​​术的文章,发现Valgrind非常有趣。 它似乎使用动态代码分析技术。 我跟着从原始引用到其他名为Path Profiling的链接 。 我试过谷歌搜索,但我想我使用错误的术语来搜索这些概念的一个很好的参考。 有人建议一个好的资源考虑到我没有编译器和编程语言的背景吗?

在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)