草庐IT

c++ - GDB 如何知道它必须在指定的断点处中断?

一个基本问题,我是C/C++和GDB的新手。我们使用GDB来调试进程。我们将GDB附加到一个进程,然后指定filename.c和行号以放置断点。我的问题是“在我们将GDB连接到正在运行的进程后,GDB或操作系统或其他任何可能的东西如何知道它必须在指定的行号(在filename.c中)中断?”比方说,当前进程在Debug模式下运行并应用断点并且进程执行必须在该点中断(等待用户输入)是什么情况? 最佳答案 如果您的程序在特定点停止或崩溃,调试器可以告诉您该点在程序中的位置。为了使这两者都起作用,程序二进制文件必须包含额外的调试信息,这些

c++ - GDB如何在运行时评估C++表达式

在调试时,我最近注意到GDB能够在调试程序时评估“复杂”表达式,我想知道它是如何做到这一点的。例如,使用以下代码:intmain(){std::vectorv={1,2,3};intk=0;std::cin>>k;v.push_back(k);returnv.at(0);}我能够编译程序g++-gmyprogram.cpp并在GDB中调试它,这样我就可以输入类似printv.at(4);的内容(在动态输入k后打印正确的值)和printv.at(2)==3结果为真。我想知道GDB是如何做到这一点的。ThisSOquestion暗示它是“在内存中编译”的东西,但没有进一步详细说明,所以我想

c++ - 如何在 GDB 中访问 std::tr1::shared_ptr 的目标

如何在GDB中访问std::tr1::shared_ptr的目标。这不起作用:(gdb)psharedPtr->variableOfTarget如果我尝试使用指针对象本身(psharedPtr),我会得到如下结果:$1=std::tr1::shared_ptr(count2)0x13c2060使用普通指针,我可以执行p*ptr并获取所有数据或仅获取一个变量的pptr->variable。我在Centos6.5、GCC4.4.7-4.el6和GDB7.2-64.el6_5.2上。 最佳答案 ptr->get()并不总是有效。当我尝试p

c++ - 在GDB中操作以$开头的C++成员变量

我正在使用具有非常特殊编码风格的C++代码库,包括在类中为成员变量添加前缀“$”。对于以前从未遇到过此问题的人来说,它不是C++标准的正式组成部分,而是lurksaroundforbackwardscompatibility.举个例子:#includeclassT{public:int$x;inty;};intmain(){T*t=newT();t->$x=t->y=42;std::cout$x="$x这在GDB中引入了一个问题。GDB通常使用$前缀变量作为神奇的便利变量(例如引用以前的值)。启动GDB,在cout语句处设置断点,并尝试打印t->$x。pt运行良好。p*t运行良好。pt

c++ - gdb:(未找到调试符号)

我有一个名为测试的文件。即使在使用-g编译它之后,当我在gdb中运行它时,它也说找不到调试符号。我也尝试过使用-ggdb但它也没有用。请帮忙。Outputfor:gdbtestThisGDBwasconfiguredas"x86_64-linux-gnu".Forbugreportinginstructions,pleasesee:...Readingsymbolsfrom/usr/bin/test...(nodebuggingsymbolsfound)...done. 最佳答案 问题是您正在尝试调试错误的程序。你的程序叫做test

c++ - 使用 gdb 进行核心转储分析

我有几个关于核心转储的问题。我在Windows上有gdb,使用的是Cygwin。核心转储文件的位置是什么?它是一个.exe.stackdump文件吗?(这是崩溃后唯一生成的文件)我在其他论坛上看到核心转储文件名为“core”。但是我没有看到任何名为“core”的文件。打开和理解核心转储文件的命令是什么? 最佳答案 您需要通过包含来配置Cygwin以生成核心转储error_start=x:\path\to\dumper.exe在您的CYGWIN环境变量中(有关详细信息,请参阅“dumper”部分中的here)。如果您不这样做,您将只会

c++ - gdb,为什么 "next"将每个源代码行显示两次?

各位,当在gdb中使用“next”指令时,我发现每行源代码显示两次-----我很确定,这些代码没有在任何循环中。这是现象:(gdb)frame#0ap_get_client_block(r=0x8560d48,buffer=0xb68501b7"SMS101SMSMsgFilterReq13925237429abc圲34¨圲23a露07\214圲21¢<237朲11?东215圲10°<214朲27¥応227露07\214正常,hao"...,bufsiz=81920)athttp_filters.c:15401540if(r->remainingread_chunked&&r->rem

c++ - 将 GDB 与 Eigen C++ 库一起使用

我正在使用可从http://eigen.tuxfamily.org/下载的EigenC++库.这是一个C++库,可以更轻松地处理矩阵和数组。我使用g++编译器和gdb进行调试。但是,我发现在使用gdb时无法打印Matrix(由Eigen提供)的内容。 最佳答案 您必须安装可以在eigen/debug/gdb/中找到的gdb扩展.文件开头的注释解释了如何安装它。 关于c++-将GDB与EigenC++库一起使用,我们在StackOverflow上找到一个类似的问题:

c++ - GDB 不断产生 "No line xx in file"错误,即使文件中包含以下行

这真的很烦人。我用几个文件得到了这个,但我不明白为什么。这是一个示例源代码。(请不要关心内容,只需复制粘贴并在my_atoi函数的某处设置断点,gdb不允许设置断点)。my_atoi适用于十进制、八进制和十六进制数,将C风格的字符串(表示具有这些基数的数字)转换为整数(不过这只是为了练习。我不会用它,所以别担心).为了正确测试它,请在命令行中输入一个参数。即./my_atoi0x12编译命令如下:g++-g-omy_atoimy_atoi.cpp这是gdb命令:gdb-r--annotate=3my_atoi我为遇到类似错误的另一个文件启用了-r,并且它已修复(虽然我不明白为什么)。但

c++ - 段错误 : and the disassembly is different between objdump and gdb

[深呼吸。]我们有一个使用WxMotif2.6.3弹出窗口的应用程序(GUI库过去不是——现在也不是——我的选择)。它在32位ix86系统上运行良好。我的任务是将它转换为64位应用程序。它总是出现段错误。我在RHEL6上,所以我使用gcc4.4.7编译。在咬牙切齿之后,问题似乎很明显:在wxFrame::DoCreate中,m_mainWidget被设置(正确);在wxFrame::GetMainWidget中,它作为空指针返回。空指针导致崩溃。使用gdb,设置m_mainWidget的指令是mov%rax,0x1e0(%rdx)#$rdx=0x68b2f0而获取m_mainWidge