debugging相关内容
我一直在谷歌上搜索并检查 gdb 手册,但似乎无法找到我正在尝试做的事情的答案. 有没有办法让 gdb 打印出给定类类型的所有方法的列表?print 命令似乎只显示数据成员和字段,没有显示任何方法. 此外,更进一步,有没有办法打印给定基 * 指针的所有正确虚拟方法?比如说: 结构 A{虚空 foo() {}};结构 B:公共 A{无效 foo() {}};主函数(){A *b = 新
..
现在它只显示数组的第一个元素,但我想要查看数组中的所有元素.我认为 Clion 正在使用 GDB. 编辑:我特指堆上的数组.堆栈上的数组可以可视化. 解决方案 很遗憾,CLion 目前不支持该功能.正如 JetBrains 员工 建议的那样,您可以使用解决方法.在 Evaluate/Watches 窗口中使用以下表达式: (MyType[128])myArray 您可以使用任意数
..
我有一个极其复杂的 shell 脚本,它在其中调用一个我想通过 GDB 调试的 C++ 程序.将这个 c++ 程序与 shell 分开是非常困难的,因为它有很多分支和很多环境变量设置. 有没有办法在这个 shell 脚本上调用 GDB?看起来 gdb 需要我直接调用 C++ 程序. 解决方案 有两种选择: 直接在 shell 脚本中调用 GDB.这意味着您没有重定向标准输入和标
..
..
当我对加载链接到 pthread 的 .so 的程序运行 GDB 时,GDB 报告错误“找不到新线程:通用错误". 请注意,我运行的可执行文件未与 pthread 链接. 有什么线索吗? $ gdb --args lua -lluarocks.requireGNU gdb (GDB) 7.0-ubuntu版权所有 (C) 2009 Free Software Foundation,
..
从 10.5 开始,围绕 macOS 的协同设计问题有很多主题.我想要实现的是,让 Geany 使用 GNU 调试器 (gdb).在 geany 中可以找到调试器,但(已经非常清楚)错误消息是: 来自调试器后端的错误消息:无法找到进程 ID 39847 的 Mach 任务端口:(os/kern) 失败 (0x5).\n(请检查 gdb 是否经过代码签名 - 请参阅 taskgated(8))无法
..
我一直有这个问题,但似乎总是推迟问这个问题,因为我好像做错了什么......但现在我觉得不是......拿了这个代码: #include #include #include int main(int argc, char** argv){如果(argc 用命令编译: g++ -std=c++11 -Wall main.cpp -o main -O
..
list 命令打印一组行,但我需要一行,我在哪里以及可能发生错误的位置. 解决方案 我在调试时确实得到了相同的信息.虽然不是在我检查堆栈跟踪时.我认为您很可能会使用优化标志.检查此 链接 - 相关的东西. 尝试使用 -g3 进行编译,删除任何优化标志.那么它可能会起作用.HTH!
..
所以我写了错误的代码,偶尔会崩溃......并创建了一个堆栈转储文件. 使用 addr2line 我可以通过将地址解码为 1 来弄清楚程序是如何到达崩溃点的.是否有替代工具可以使用堆栈转储来简化调试?有没有办法在 Insight/Gdb 中加载这些信息? 解决方案 您可以指示 Cygwin 在发生故障时及时启动您的 gdb 调试器.为此,请将 error_start=action 添
..
在使用 gcc 或 Clang 编译 C 源代码时,我总是使用 -g 标志为 gdb 生成调试信息. gcc -g -o helloworld helloworld.c 我注意到有些人推荐-g3.-g 和 -g3 标志之间有什么区别?-g和-ggdb还有区别吗? 解决方案 来自 文档: -g 以操作系统的本机格式(stabs、COFF、XCOFF 或 DWARF 2
..
在 Visual Studio 中,您可以看到函数所在的位置,即在哪个编译的二进制文件中.例如: GDB 有命令吗? 如果你加载一个 dll,一个符号的多个版本可以加载两次.必须了解代码是在 .exe 中执行还是在已加载的 .dll 库之一中执行.Visual Studio 调试器在提供的屏幕截图中显示此信息(虽然它是针对 C#,但我只是从网站上复制了它). 当我使用 Visua
..
..
我的二进制文件使用了许多不同的共享库.使用 gdb 附加该进程时,从所有这些库加载和读取符号大约需要 5 分钟. 有没有办法在使用 gdb 附加进程时选择性地读取和加载符号? 解决方案 你可以set auto-solib-add off 然后使用 sharedlibrary 命令选择性地加载符号.示例: $ gdb -e ./a.out(gdb) 设置 auto-solib-add
..
我写了两个简单的程序: int main(int ac, char **argv) {execv("/home/me/Desktop/execvtest2", argv);} 和 int main(int ac, char **argv) {execv("/home/me/Desktop/execvtest1", argv);} 我已经编译了它们gcc -g 到相应的输出文件.我正在使用
..
我有这个 C 文件(sample.c): #include #定义 M 42#define ADD(x) (M + x)主函数(){printf("%d\n", M);printf("%d\n", ADD(2));返回0;} 我用来编译的: $ gcc -O0 -Wall -g3 sample.c -o sample 然后调试 $ gdb ./sampleGNU gdb
..
我正在尝试使用 GDB 调试一个简单的 C 项目,但无论我如何编译,GDB 似乎都找不到该程序的调试符号. 当我将程序加载到 GDB 中时,它声称已成功读取符号,因为它会打印 从/home/edward/读取符号...完成. 但是,当我运行程序时,由于分段错误而中断,然后键入 info locals,它说 没有可用的符号表信息. 另外,bt 显示执行在我编写的
..
我想为/bin/ls 添加一些额外的功能. 所以我在gdb上启动它,并在开头添加了一个断点. 现在的问题是:如何更改内存中正在运行的程序的代码?我可以看到汇编代码,但我无法修改.我该怎么做? 例如,在 Windows 上,我可以使用 oldbg 轻松做到这一点.在 Linux 上怎么样? (我知道这样做只会更改内存中进程的代码.所以我可以将内存转储到文件中,然后我会将更改保存在
..
我目前有一个棘手的错误发生在我无法访问源代码或符号的地方,即我可以看到发生崩溃的指令及其地址,但仅此而已.我想做的是让 gdb 在不需要交互的情况下运行并显示每条指令,但我还没有找到方法. 我希望实现的是这样的: (gdb)/* 一些命令 */0x2818a7c0:推送 %ebp0x2818a7c1: 移动 %esp,%ebp0x2818a7c3: 推送 %ebx0x2818a7c4: 低
..
Freedos 引导加载程序似乎存在问题.(在某些情况下,引导代码似乎找不到内核.) 所以我正在尝试使用 gdb 调试 qemu 中的引导加载程序.按照在几个 wiki 和免费在线课程资料上找到的说明,我像这样运行 qemu qemu-system-i386 -fda fdboot.img -boot a -s -S 然后像这样连接gdb $ gdb(gdb) 目标远程 localho
..
如何在调用 gdb 时打印感兴趣的函数,并根据它们在堆栈中的深度进行缩进? 我希望能够说出类似(编造)的话: (gdb) trace Foo* Bar* printf 并让 gdb 打印所有以 Foo 或 Bar 开头的函数,因为它们被调用.有点像 gnu cflow,除了使用调试符号并且只打印实际调用的函数,而不是所有可能的调用流. 无法提供帮助的工具包括 cachegrind、
..