编辑:我在评论者的帮助下弄明白了。回答我标题中提出的问题:不,这不是堆栈损坏,它的gdb报告了错误的值。该程序实际上按预期运行并且具有正确的this指针。促使我发布此问题的实际错误行为可能与我在此处描述的问题完全无关。首先是一个警告。我相信这是一个内存损坏问题,除了“彻底检查你的代码”之外,我通常不会期望得到答案,但我已经看到这种行为反复出现,希望你们中的一些人对这个问题有洞察力以及我是如何做的可以找到它的来源。我目前正在实现区间静态分析,它跟踪C程序中变量的可能范围。我的基区间类的复制构造函数如下所示:itvt::itvt(constitvt&i):_i(i.type==INTBV?
我的类是在头文件中定义的,我需要在GDB中监视它的私有(private)非静态成员,如下所示:classfoo{intbar;}; 最佳答案 您可以在内存地址上设置观察点。您应该在foo构造函数执行后的某处停止您的代码并打印bar变量地址。然后你可以像这样在地址上设置观察点:(gdb)p&bar$1=(int*)0x10793ad0(gdb)watch*0x10793ad0 关于c++-如何为实例变量设置观察点?,我们在StackOverflow上找到一个类似的问题:
当尝试使用程序运行gdb时,它会在读取符号时出现错误。当我运行时:gdb/home/user/path/to/program.exe我得到:GNUgdb(Ubuntu7.7-0ubuntu3.1)7.7Copyright(C)2014FreeSoftwareFoundation,Inc.LicenseGPLv3+:GNUGPLversion3orlaterThisisfreesoftware:youarefreetochangeandredistributeit.ThereisNOWARRANTY,totheextentpermittedbylaw.Type"showcopying"a
我发现自己处于几乎没有任何调试工具的情况下不得不调试Qt应用程序的困难境地:应用程序似乎开始使用越来越多的CPU,因为它一次又一次地运行相同的操作;许多小时后CPU完全饱和。该应用程序在ARMLinux嵌入式设备上运行,其中gdb似乎无法工作,可能很难通过提供的工具链发现问题。strace似乎只报告计时器事件(这是一个OpenGL应用程序,所以这是预期的)。ltrace不可用,编译它导致了一项艰巨的任务,也许毫无用处。我没有编写应用程序,但源代码可用。我还能做些什么来发现应用程序在消耗那么多资源时忙于做什么吗?我必须以任何方式跟踪应用程序执行的所有方法调用吗?我可以使用任何其他技术来尝
我试图调试我的小词法分析器并遇到了这个问题:QtCreator-Debugger不显示我的std::string-variable的任何内容。我尝试在控制台中对其进行调试,但得到了相同的结果,只是简单的结构信息。我前几天用的那个版本的QtCreator确实显示了字符串的内容。所有其他STL元素,如std::vector、std::map、std::multimap等显示正确的数据,只是std::string类不正确。经过几个小时的谷歌搜索后,我发现了很多描述pretty-print创建的网页,我解决这个问题的非常笨拙的方法并没有帮助。我有什么想法可以摆脱这个错误吗?注意:字符串变量的“
我使用boost::mpl::string广泛的类型......足以真正帮助调试以在gdb中漂亮地打印类型.所以...而不是gdb像当前一样显示单个(多字rune字)组件...boost::mpl::string它会显示等效的字符串值而不是...boost::mpl::string我看过gdbgdb中用于pretty-printSTL容器的宏和python脚本,但我找不到一个pretty-printboost::mpl字符串。有人可以帮忙吗?更新:我已经添加了一个+100赏金......我正在寻找一种解决方案,它利用最新的GDB支持通过python进行pretty-print(如对ST
我们都知道内联函数会使调试变得更加棘手,因为它们可以从堆栈跟踪等中删除。但是假设我想从gdb中调用一个内联函数,并且我知道它的名称和参数。我认为我应该能够做到这一点,但我明白了:Cannotevaluatefunction--maybeinlined我用nm列出了我正在使用的共享库中的符号,发现我要调用的函数不在里面。没什么大惊喜。我想要的是一种生成这些内联函数的可见定义的方法。我可以访问当前包含内联定义的头文件,但我无法真正修改这些头文件。也许有某种方法可以告诉编译器发出它在翻译单元中看到的所有内联函数的定义?或者其他一些可以更轻松地在gdb中调用和检查内联函数结果的技巧?我在Lin
我正在尝试调试一个严重依赖继承的类。调试session很乏味,因为它涉及一个对象在链中的另一个对象上调用相同的函数。我在单步执行不相关的代码上浪费了很多时间,这些代码本可以用在其他地方更好。这是简单的:我想使用通配符在类实例上设置断点,例如bFoo::*.这样,当我感兴趣的东西进入作用域(如静态函数或成员函数)时,调试器就会捕捉。这是困难的一个:参数化类:我想使用通配符在模板化类的成员函数上设置断点,例如bFoo::bar.(实际问题比这更糟糕,因为模板参数本身就是模板类)。虽然GDB似乎让我设置一个,但调试器并没有停止(见下文)。它声称它在未来的负载上设置了一个断点。事实上,我使用静
让我们从描述发生的事情开始:我正在Windows上使用SDL2库。我可以使用它编译程序,当我运行.exe时,它工作得很好。当我尝试使用GDB调试它时出现问题-当代码进入SDL_Init或SDL_OpenAudio函数(可能创建新线程)时,GDB停止,显示“程序收到信号?,未知信号”消息,当我恢复执行时程序崩溃。显然GDB(https://www.mail-archive.com/cygwin@cygwin.com/msg149735.html)中存在与线程命名相关的错误,应该在GDB版本7.11.1-1中修复。起初我使用GCC5.1.0(TDM)和GDB7.6.1,所以我决定更新到
一、简介通过gdb调试我们可以监控程序执行的每一个细节,包括变量的值、函数的调用过程、内存中数据、线程的调度等,从而发现隐藏的错误或者低效的代码,程序的调试过程主要有:单步执行,跳入函数,跳出函数,设置断点,设置观察点,查看变量。本文将主要介绍linux下的gdb调试工具常用的命令和具体的使用实例。二、调试过程介绍2.1编译程序加参数时生成调试信息-g和-ggdb都是令gcc生成调试信息,但是它们也是有区别的选项解析g该选项可以利用操作系统的“原生格式(nativeformat)”生成调试信息。GDB可以直接利用这个信息,其它调试器也可以使用这个调试信息ggdb使GCC为GDB生成专用的更为丰