我有一些这样的C++代码,我正在使用GDB:
void foo(int num) { ... }
void main() {
Baz baz;
foo (baz.get());
}
Run Code Online (Sandbox Code Playgroud)
当我进去时main(),我想介入foo(),但我想要跳过去 baz.get().
在GDB文档说,"如果有一个函数行号信息的步骤命令只进入功能",所以我会很高兴,如果我能删除行号信息,baz.get()从我的可执行文件.但理想情况下,我可以告诉GDB"永远不会进入Baz类的任何功能".
有谁知道如何做到这一点?
如何配置Qt Creator和/或gdb,以便在使用Qt库调试程序时调试器可以避免插入Qt的源文件?
我正在使用Qt Creator和gdb在Linux平台上调试我的C++代码.每当我使用a boost::shared_ptr等时,调试器都会进入包含boost实现的头文件(即/ usr/include /boost/shared_ptr.hpp).我想在调试方面忽略这些文件,然后简单地跳过它们.我知道我可以在它到达其中一个文件时立即退出,但是如果不在每个调试会话中多次这样做,那么调试会更容易.
我正在使用gcc编译器(g++),在带有QtCreator 2.2的OpenSuSE Linux 11.2上运行(gdb用作调试器).
编辑添加:问题适用于Boost文件,但也可以应用于STL文件.
CLion 2017 有没有办法仅在调试程序时进入项目源文件?
例如在下面的代码段中,
function1 (boost::doSomething())
我有一个来自外部库(例如boost)的函数,我不希望调试器在单步执行程序时进入该函数。
是否有设置强制 CLion 跳过单步执行外部库中的任何代码?
我目前有一个棘手的错误发生在我无法访问源或符号的地方,即我可以看到崩溃发生的指令及其地址,但就是这样.我想做的是gdb运行而不需要交互并显示每条指令,但我还没有找到办法.
我希望实现的是这样的:
(gdb) /* some command */
0x2818a7c0: push %ebp
0x2818a7c1: mov %esp,%ebp
0x2818a7c3: push %ebx
0x2818a7c4: sub $0x4,%esp
...
0x28563622: mov %esi,0x0(%eax)
Program received signal SIGSEGV, Segmentation fault.
Run Code Online (Sandbox Code Playgroud)
我一直在做的是为程序计数器设置一个显示器,如下所示:
(gdb) display/i $pc
Run Code Online (Sandbox Code Playgroud)
然后运行代码stepi:
(gdb) stepi
1: x/i $pc 0x2818a7c0: push %ebp
Run Code Online (Sandbox Code Playgroud)
然而,崩溃是数百或数千条指令,我想要一种方法来看每一个(一起,如果可取的话),而不必多次点击"输入".另外,如果我是手动完成的,我会(gdb)在每条指令之间看到一个提示,这是不太理想的.
我简要介绍的一条路线是脚本,但我唯一的想法是设置main(),显示和另一个中断(下一条指令),然后继续,但后来我不能commands在一个commands块内使用,所以它不会像我想象的那样工作.
如果它很重要,我正在使用FreeBSD.
到目前为止,使用gdb + qemu,我可以进入/超过linux内核源代码.是否可以同时调试用户空间程序?例如,从用户空间到内核空间单步执行一个程序,这样我可以通过发出来观察qemu监视器上寄存器的变化info registers?
在vscode中进行调试时,我想制作一些"黑盒子 "并且不要输入我没写的代码.我怎样才能做到这一点?
例如,与:
#include <functional>
#include <iostream>
int myfunc(int i){ return i + 1; }
int main() {
std::function<int(int)> f = myfunc;
int i = f(1);
std::cout << i << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
编译:
g++ -ggdb3 -O0 -std=c++11 -Wall -Wextra -pedantic -o main.out main.cpp
Run Code Online (Sandbox Code Playgroud)
如果我尝试step进入调用f(1),那么它首先会引导我进入 C++ 标准库代码,我要么必须非常认真地思考并执行正确的next/step顺序,要么step在达到实际之前愚蠢并击中17 次myfunc电话。
有没有更简单的方法来解决这个问题,也许使用一些现有的 GDB/Python 脚本?
这基本上是由 Microsoft 人员为 Visual Studio 完成的,如下所述: https //devblogs.microsoft.com/cppblog/improving-the-debugging-experience-for-stdfunction/
我喜欢它可以在 Ubuntu 中默认进入 stdlibc++ 并且之前已经使用过它,但是如果 GDB 可以std::function默认进入用户代码,并且有一些其他机制可以进入 libstdc++ …
这篇文章简要讨论了我面临的同样的问题。本质上,gdb 是否有默认设置或 hack 来停止步进到每个 glib 库中,而只步进到用户文件中?我知道每次它进入其中时我都可以调用finish,但我宁愿避免一些浪费的按键。
它已经很烦人了,因为它要处理 g++ 的输出。如果这种暴露狂无法阻止,那么这些 GNU 工具有没有好的替代品呢?我确实听说过有关 Eclipse 的好消息,但我只是一个寻求以最小的努力进行快速而肮脏的修复的学生。