草庐IT

c++ - GDB 问题 : Pretty-Printing a 2D Array?

我有一个二维数组矩阵[10][10],我想在调试时检查它。我知道我可以在GDB中使用p*matrix@10但它在一行中输出,难以阅读。有没有办法让这个输出以任何方式格式化,比如说矩阵? 最佳答案 GDB的一个重要特性是在被调试代码中执行函数的能力,因此您可以实现任何您喜欢的打印,例如:#includeintmatrix[10][10];voidprint(intmatrix[10][10]){inti,j;for(i=0;i使用-g开关编译此代码并在GDB下运行后,您可以使用打印功能如下:(gdb)callprint(matrix)

c++ - 防止 GDB 中的 PLT(过程链接表)断点

在最新版本的GDB中,在库函数调用上设置断点会导致多个实际断点:调用过程链接表(PLT)实际的函数调用这意味着当调用库函数时,我们每次都会经历两次中断。在以前的GDB版本中,只会创建#2,因此您只能获得一次中断。那么问题来了:没有对应的PLT断点可以创建库函数调用断点吗?我知道您可以创建一个常规断点,然后显式禁用PLT断点,但这确实很乏味。 最佳答案 我想我找到了解决这个问题的方法。您可以使用break*addressbreak的语法,但不是指定十六进制地址,而是给出函数的名称(计算结果为函数的地址)。类似的东西break*myfu

c++ - windows下使用mingw/gdb无法调试eclipse helios cdt上的小程序,控制台死机

我一直在尝试使用EclipseCDT来做一些c++示例,我可以使用run命令很好地运行它们,但是每当我尝试调试时,控制台窗口就会卡住,我可以输入,但是程序无法继续。当我调试时,我在控制台窗口上得到以下输出(没有断点,但由于默认设置而在main上中断):Hello,worldputyourname:15^running当我输入内容并点击enter时,继续按钮被禁用并且不执行任何操作。15是一个随机数,有时是16、20等。如果我在eclipse下运行程序,我会得到输入提示就好了:Hello,worldputyourname:testHellotest这是我尝试调试的代码:#include#

c++ - 如何在 GDB 中调试程序时获取程序的环境

我正在Linux上的GDB中调试一个程序。我正在使用getenv和setenv调用来读取和设置环境变量。例如我调用setenv("TZ","UTC",1);来设置时区的TZ环境变量。要检查是否设置了env变量,我正在使用GDB命令showenvironment。这将打印所有环境变量及其值。但它没有显示TZ正在设置。即使命令showenvironmentTZ说未定义环境变量“TZ”。他们是另一种检查被调试程序环境的方法吗?p*(char*)getenv("TZ")返回正确的值UTC. 最佳答案 gdb命令showenvironment

c++ - 在 gdb 中调用 operator<<

您如何调用operator从gdb内部?换句话说,如何在gdb中打印一个对象?callstd::cout或calloperator似乎不适合我!有什么想法吗? 最佳答案 我找到的唯一方法是:call'operator自从std::cout由于某种原因gdb看不到,我不得不像这样创建自己的:std::ostreammycout(std::cout.rdbuf());您没有说明任何想要这样做的理由,但不会printyourvariable更容易?如果这是绝对必须的,您可以拥有Print类中的方法并从operator调用它然后调用Prin

c++ - 如何在gdb中获取当前被调试进程的pid?

在gdb内部,什么命令会提供被调试进程的pid?大部分googleresults仅讨论知道pid后如何将gdb附加到进程。 最佳答案 一个简单的方法是infoferior。这里我自己调试gdb,这个命令显示了被调试对象的PID:(top-gdb)infoinferiorNumDescriptionExecutable*1process14068/home/tromey/gdb/build/gdb/gdb你也可以只调用普通的C函数:(top-gdb)printgetpid()$3=14068

c++ - 使用 gdb 调用 printDebug 方法

我有一个带有printDebug方法的类。它没有在代码中的任何地方使用,但我想在使用gdb调试时使用它(使用调用)。这基本上是以格式良好的方式打印对象的内容,例如我可能有一个集合vector。用于此的g++选项是什么?我试过-O0但这不起作用。我使用的解决方法是在构造函数中进行伪调用以调试打印并提供一个bool值来指示您是否真的想要打印或什么都不做。这工作正常,但必须有更好的方法来做到这一点。如果我理解正确-O0不应该做任何优化,所以不应该消除死代码,但也许我错了。 最佳答案 如果您有一个未在代码中任何地方使用的方法,gcc智能功能

python - 带有 GDB : the case of nlohmann json library 的 C++ 调试/打印自定义类型

我正在使用nlohmann'sjsonC++implementation进行一个项目.如何在GDB中轻松探索nlohmann的JSON键/值?我试过用这个STLgdbwrapping因为它为探索nlohmann的JSON库正在使用的标准C++库结构提供了帮助。但是我觉得不方便。这是一个简单的用例:jsonfoo;foo["flex"]=0.2;foo["awesome_str"]="bleh";foo["nested"]={{"bar","barz"}};我想在GDB中拥有什么:(gdb)pfoo{"flex":0.2,"awesome_str":"bleh","nested":etc

c++ - 如果对象的类类型类似于 A::B,如何使用 GDB 从地址打印 c++ 对象成员

这个问题在这里已经有了答案:Whygdbcastingisnotworking?(4个回答)关闭6年前。从此链接gdbinterpretmemoryaddressasanobject我们知道,如果类类型A的对象位于特定地址,例如0x6cf010,那么我们可以使用:(gdb)p*(A*)0x6cf010打印此对象的成员元素。但是,当涉及c++命名空间时,这似乎不起作用。也就是说,如果类类型为A::B的对象,那么下面的所有尝试都不起作用:(gdb)p*(A::B*)0x6cf010(gdb)p*((A::B*)0x6cf010)那么,谁知道在这种情况下如何打印对象元素呢?我们可以使用以下经

c++ - 运行时计数器退出代码 139,但 gdb 使其通过

我的问题听起来很具体,但我怀疑它仍然可能是C++调试问题。我正在使用omnet++来模拟无线网络。omn​​et++本身就是一个c++程序。我在运行我的程序时遇到了一个奇怪的现象(在Ubuntu12.04中使用omnet++4.2.2修改了inet框架):当触摸代码的某个部分时,程序以退出代码139退出(人们说这意味着内存碎片),当我尝试调试时,gdb不会报告模拟之前退出的“有问题”代码有任何问题,实际上,调试会通过这部分代码并输出预期结果。gdb版本信息:GNUgdb(Ubuntu/Linaro7.4-2012.04-0ubuntu2.1)7.4-2012.04谁能告诉我为什么运行失