我在分析核心转储时尝试打印以下行时收到此消息。(gdb)p/x*($esi)Cannotaccessmemoryataddress0xe6d3a030我提到%esi(0xe6d3a030)指向的地址应该指向一些有效的分配数据。(当我自己运行这个程序并按照相同的指令中断时,这个打印有一些有意义的信息)造成这种情况的可能原因是什么?我是否遗漏了核心转储中的一些信息?如果是,我缺少什么信息?核心转储不应该包含所有已分配内存的快照吗?编辑:当我在加载核心转储时在gdb“维护信息部分”命令中使用时,我得到下面显示的信息。我可以看到地址0xe6d3a030在0xe6d00000->0xe6dfb0
我已经建立了一个库,提供从标准异常派生的异常类:#include#includeclassBaseException:publicstd::runtime_error{public:BaseException(std::stringconst&msg);};到目前为止,一切都很好。在Unix上编译和处理得很好。现在我正在准备将其编译成WindowsDLL:#ifdefWIN32#defineMY_EXPORT__declspec(dllexport)#else#defineMY_EXPORT#endif#include#includeclassMY_EXPORTBaseExceptio
我想设置一个断点,每次通过cout流将某些内容写入stdout时触发,但我无法找到可能的位置断点。如何在gdb中执行此操作? 最佳答案 这是一种依赖于平台的方式。如果您在x86_64上并使用gcc构建写入std::cout会导致调用fwrite。回溯看起来像这样:#00x0000003c2fc622a0infwrite()from/lib64/libc.so.6#10x0000003c43289655instd::ostreambuf_iterator>std::num_put>>::_M_insert_int(std::ostre
我有一个使用OpenCV和cmake的简单项目,并且有两个源文件只有segmentation.h和segmentation.cpp。这是cmake文件:project(Segment)cmake_minimum_required(VERSION2.8)SET(CMAKE_BUILD_TYPEDebug)SET(CMAKE_VERBOSE_MAKEFILEtrue)if(CMAKE_COMPILER_IS_GNUCXX)message(STATUS"GCCdetected,addingcompileflags")set(CMAKE_CXX_FLAGS"${CMAKE_CXX_FLAGS}
当它给出带有以下输出的回溯时是什么意思?#00x00000008009c991cinpthread_testcancel()from/lib/libpthread.so.2#10x00000008009b8120insigaction()from/lib/libpthread.so.2#20x00000008009c211ainpthread_mutexattr_init()from/lib/libpthread.so.2#30x0000000000000000in??()程序因标准信号11、段错误而崩溃。我的应用程序是一个在FreeBSD6.3上运行的多线程FastCGIC++程序,
我有一个二维数组矩阵[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)
在最新版本的GDB中,在库函数调用上设置断点会导致多个实际断点:调用过程链接表(PLT)实际的函数调用这意味着当调用库函数时,我们每次都会经历两次中断。在以前的GDB版本中,只会创建#2,因此您只能获得一次中断。那么问题来了:没有对应的PLT断点可以创建库函数调用断点吗?我知道您可以创建一个常规断点,然后显式禁用PLT断点,但这确实很乏味。 最佳答案 我想我找到了解决这个问题的方法。您可以使用break*addressbreak的语法,但不是指定十六进制地址,而是给出函数的名称(计算结果为函数的地址)。类似的东西break*myfu
我一直在尝试使用EclipseCDT来做一些c++示例,我可以使用run命令很好地运行它们,但是每当我尝试调试时,控制台窗口就会卡住,我可以输入,但是程序无法继续。当我调试时,我在控制台窗口上得到以下输出(没有断点,但由于默认设置而在main上中断):Hello,worldputyourname:15^running当我输入内容并点击enter时,继续按钮被禁用并且不执行任何操作。15是一个随机数,有时是16、20等。如果我在eclipse下运行程序,我会得到输入提示就好了:Hello,worldputyourname:testHellotest这是我尝试调试的代码:#include#
我正在Linux上的GDB中调试一个程序。我正在使用getenv和setenv调用来读取和设置环境变量。例如我调用setenv("TZ","UTC",1);来设置时区的TZ环境变量。要检查是否设置了env变量,我正在使用GDB命令showenvironment。这将打印所有环境变量及其值。但它没有显示TZ正在设置。即使命令showenvironmentTZ说未定义环境变量“TZ”。他们是另一种检查被调试程序环境的方法吗?p*(char*)getenv("TZ")返回正确的值UTC. 最佳答案 gdb命令showenvironment
您如何调用operator从gdb内部?换句话说,如何在gdb中打印一个对象?callstd::cout或calloperator似乎不适合我!有什么想法吗? 最佳答案 我找到的唯一方法是:call'operator自从std::cout由于某种原因gdb看不到,我不得不像这样创建自己的:std::ostreammycout(std::cout.rdbuf());您没有说明任何想要这样做的理由,但不会printyourvariable更容易?如果这是绝对必须的,您可以拥有Print类中的方法并从operator调用它然后调用Prin