Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在c++ lldb中使用重载运算符计算表达式

在c++ lldb中使用重载运算符计算表达式
EN

Stack Overflow用户
提问于 2013-12-04 23:01:42
回答 1查看 8.7K关注 0票数 19

我正在使用lldb在Xcode5中调试一个C++程序,我想在调试器中计算任意表达式,特别是那些使用重载操作符的表达式。

例如,我创建了一个非常简单的Xcode5 C++项目,并将以下main.cpp和所有编译器/链接器/etc选项设置为默认值:

代码语言:javascript
运行
AI代码解释
复制
#include <iostream>
#include <vector>

int main(int argc, const char * argv[])
{
  std::vector<int> vec;
  vec.push_back(42);
  std::cout << "vec[0] = " << vec[0] << std::endl;
  return 0;
}

我在return 0;行上设置了一个断点并运行了程序。

然后,在lldb提示符下,将向量打印为一个整体:

代码语言:javascript
运行
AI代码解释
复制
(lldb) expr vec
(std::__1::vector<int, std::__1::allocator<int> >) $0 = size=1 {
  [0] = 42
}

但是,我不能使用重载的operator[]访问它的成员

代码语言:javascript
运行
AI代码解释
复制
(lldb) expr vec[0]
error: call to a function 'std::__1::vector<int, std::__1::allocator<int> >::operator[](unsigned long)' ('_ZNSt3__16vectorIiNS_9allocatorIiEEEixEm') that is not present in the target
error: The expression could not be prepared to run in the target

类似地,我无法获得迭代器(尽管我在这方面的经验较少,因此我的语法可能是错误的):

代码语言:javascript
运行
AI代码解释
复制
(lldb) expr vector<int>::iterator it = vec.begin()
error: use of undeclared identifier 'vector'
error: expected '(' for function-style cast or type construction
error: expected '(' for function-style cast or type construction
error: 3 errors parsing expression

代码语言:javascript
运行
AI代码解释
复制
(lldb) expr (vector<int>::iterator) vec.begin()
error: use of undeclared identifier 'vector'
error: expected '(' for function-style cast or type construction
error: expected '(' for function-style cast or type construction
error: 3 errors parsing expression

类似地,打印一个简单的字符串也很好:

代码语言:javascript
运行
AI代码解释
复制
(lldb) expr string("a")
(std::__1::string) $0 = "a"

但是,简单的字符串连接会失败:

代码语言:javascript
运行
AI代码解释
复制
(lldb) expr string("a") + string("b")
error: invalid operands to binary expression ('string' (aka 'std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >') and 'string')
error: 1 errors parsing expression

我做错了什么?lldb是否支持使用重载运算符进行求值?

提前谢谢你!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-11 01:36:01

注意,C++标准库是这样设置的:它们内联它们可以合理地内联的所有模板化函数,并且不存在真正的函数副本。因此,例如,当您调用std::vector<int>::begin()时,没有这样的函数。它的所有用法都被内联了。

这就是为什么你会收到关于“调用函数...不存在于目标中”的错误。可能有函数的内联副本,但没有我们可以实际调用的副本。举个例子,如果我构建了一个生成std::vector的小C++程序,并将一些元素推入其中,然后迭代它们,然后执行以下操作:

代码语言:javascript
运行
AI代码解释
复制
    (lldb) image lookup -r -n begin
    2 matches found in /private/tmp/vector:
        Address: vector[0x0000000100000eaf] (vector.__TEXT.__text + 1071)
        Summary: vector`main + 1071 [inlined] std::__1::vector<int, std::__1::allocator<int> >::begin() at vector.cpp:12
                 vector`main + 1071 at vector.cpp:12        Address: vector[0x0000000100000eaf] (vector.__TEXT.__text + 1071)
        Summary: vector`main + 1071 [inlined] std::__1::vector<int, std::__1::allocator<int> >::begin() at vector.cpp:12
                 vector`main + 1071 at vector.cpp:12

所以std::vector<int>的begin & end访问器的所有实例都是内联的。再往下看来自std c库本身的部分:

代码语言:javascript
运行
AI代码解释
复制
12 matches found in /usr/lib/libc++.1.dylib:
    Address: libc++.1.dylib[0x000000000003e4ec] (libc++.1.dylib.__TEXT.__text + 252188)
    Summary: libc++.1.dylib`std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::begin()        Address: libc++.1.dylib[0x000000000003e51c] (libc++.1.dylib.__TEXT.__text + 252236)
    Summary: libc++.1.dylib`std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::begin() const        Address: libc++.1.dylib[0x000000000003e574] (libc++.1.dylib.__TEXT.__text + 252324)

还有一些针对basic_string的,仅此而已。所以我们不能调用任何真正的实现。然后,一旦我们只获得了这些std对象的一小部分真实世界,当你开始推动它时,世界就会以其他奇怪的方式分崩离析。

lldb目前还不够聪明,无法弄清楚如何从C++标准库的头文件中重构模板化的函数/方法。我们没有足够的环境,您的代码最初被编译来完成这项任务。

请注意,这实际上不是重载操作符的问题,而是编译器使用std库的方式的问题。对于您自己的类来说,事情应该运行得更好,在-O0中没有那么多内联。

票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20387942

复制
相关文章
QtCreator查看汇编代码
步骤 项目使用Debug版本编译。 设置代码断点。 开启调试模式(按快捷键F5或如下图)。 点击下图图标查看汇编代码: 当前使用Qt Creator 4.8.2版本。
Qt君
2020/06/04
3.1K0
QtCreator查看汇编代码
【Python】查看函数的汇编指令
今天在看一篇介绍Python生成器的文章的时候无心插柳了解到一个很有趣的Python标准库dis,可以用于查看函数的汇编指令,从而理解Python代码的执行机制。
py3study
2020/01/02
1.5K0
代码的“真面目”---如何查看cpp预处理后程序代码
cpp的宏定义,适当的使用既可以减少重复代码,又避免了模板带来的代码膨胀,是很顺手的利器。
望天
2020/12/08
6.1K0
代码的“真面目”---如何查看cpp预处理后程序代码
vs2010 c++中内嵌汇编代码
在研究汇编时,需要自己写点汇编代码测试,用Ollydbg写每次加载程序就没了,不是很方便。
墨文
2020/02/28
1K0
居然还有方式可以查看Java方法的汇编代码,真是神奇。
当我们在研究java的内部实现时,经常会需要查看java方法的字节码,有时为了确定一些问题,甚至还需要查看某些方法在jit编译后的汇编代码。
KINGYT
2020/10/30
1.4K0
居然还有方式可以查看Java方法的汇编代码,真是神奇。
深入iOS系统底层之程序中的汇编代码
合抱之木,生于毫末;九层之台,起于垒土;千里之行,始于足下。--(老子·道德经 )
欧阳大哥2013
2019/03/06
1.8K0
深入iOS系统底层之程序中的汇编代码
ubuntu下C++如何调用python程序,gdb调试C++代码
该文介绍了如何使用CMake和Python进行交叉编译,并使用gdb调试C++代码。主要包括了以下步骤:安装Python、安装CMake、编写CMakeLists.txt、编译C++代码、使用gdb调试C++代码、使用numpy数组作为参数调用Python函数。
MachineLP
2018/01/09
2.2K0
C++与汇编小结
C++与汇编小结 ---- 本文通过C++反编译,帮助理解C++中的一些概念(指针引用、this指针、虚函数、析构函数、lambda表达式), 希望能在深入理解C++其它一些高级特性(多重继承、RTTI、异常处理)能起到抛砖引玉的作用吧。 指针和引用 引用类型的存储方式和指针是一样的,都是使用内存空间存放地址值。 只是引用类型是通过编译器实现寻址,而指针需要手动寻址。 void funRef(int &ref){ ref++; } int main(){ //定义int类型变量
felix
2018/06/08
1.2K0
GCC生成的汇编代码
GCC产生的汇编代码有点难读,它包含一些我们不关心的信息。所有以 "." 开头的行都是指导汇编器和链接器的命令,称为“汇编器命令”。
Java架构师必看
2021/03/22
2.3K0
GCC生成的汇编代码
如何Ubuntu查看程序安装记录
如果新装一个程序,突然发现需要卸载,又忘记了程序名字,怎么解决呢? /var/log/apt/history.log /var/log/apt/term.log /var/log/aptitude 看看这几个文件,里面应该有你需要的。 附录: 1.查看安装的所有软件 dpkg -l dpkg -l | grep ftp #例子 2.查看软件安装的路径 dpkg -L | grep ftp #方法一 whereis ftp #方法二 3.查看软件版本 aptitude show aptitude sho
小飞侠xp
2020/04/30
2.6K0
R问题|如何查看函数的源代码
最近有读者问我,如何查看R语言某包中某函数的源代码呢?我第一时间给出了自己比较常用的方法(见方法一),今天打算做个这方面的推文,于是又查了些资料,才发现原来水好深!还有更好的方法(见方法二),并且和不同的面向对象系统有关。
庄闪闪
2021/04/08
3.1K0
围观chatGPT生成的C++代码,资深程序员如何评价?
众所周知,chatGPT可以不依赖背景立即有效地回答不精确的问题。它提供带有工作代码的答案。一位美国的Telegram算法交易员,以其所在的项目组的实际问题进行了测试,问题如下:
C语言与CPP编程
2023/04/30
3380
围观chatGPT生成的C++代码,资深程序员如何评价?
IntelliJ 源代码文件的历史如何查看
在 IntelliJ 使用的时候,我们会经常要对源代码进行查看。 如何在 IntelliJ 中快速进行查看,如何进行比较? ---- 在 IntelliJ 中,你可以使用快捷键进行查看,你也可以通过鼠标进行查看。 我们常用的查看功能使用的是查看一个文件的本地修改历史。 或者你也可以使用快捷键。 Alt + · 键,然后会弹出版本历史的快捷访问列表。 如果你选择 4 就可以查看 Git 文件提交的的历史列表。 显示文件的本地修改历史列表。 ij-history.jpg https:
HoneyMoose
2020/05/17
1.4K0
IntelliJ 源代码文件的历史如何查看
C程序反编译成汇编代码命令整理
最近使用三方的一个工程, 但是有些逻辑封装成了lib库,关键地方看不到是不是很难受, 所以顺带找了找反编译的方法,反编译出来的代码是汇编代码,比方ANTHOR_MEASURE的代码,但多少能猜的八九不离十吧,知道调用了哪些方法,参数是什么,也就够了,也不算是逆向工程,做了简单记录;
呱牛笔记
2023/05/02
9610
C程序反编译成汇编代码命令整理
通过汇编一个简单的C程序,分析汇编代码理解计算机工作原理
  首先从main函数开始分析,18行将ebp推入栈中,19行中将esp的值赋给ebp(左边值赋给右边),20行开辟4个字节(32位)的栈空间给后面的局部变量7。函数传递传递参数的方式有三种:堆栈方式、寄存器方式、以及通过全局变量进行隐含参数的传递。这里是利用堆栈传递参数,堆栈是一种“后进先出”的存储区,栈顶指针ESP指向堆栈中第一个可用的数据项。21行传入7,22行然后调用f函数,call指令可以看成是执行了
De4dCr0w
2019/02/27
5740
汇编程序
ISA指令集是由0和1组成的机器语言,难以记忆和阅读,因此人们发明汇编程序帮助记忆。 汇编基本算是和机器指令一一对应的关系,可以认为是给机器指令的每个部分分别起了别名。 一、汇编程序的组成 操作码和操作数: 操作码如ADD表示bit[15:12]=0001,AND表示bit[15:12]=0101,操作数R0表示编号为0的寄存器。 标号: 指向内存单元的一个符号名,有两种用途,一种用于跳转命令跳转的地址,另一种用于读取或存储指令时访问的内存位置 注释: 以";"开头的字符串,只给人阅读的,汇编翻译程序会忽略
linxinzhe
2018/04/10
7250
如何查看批量并行处理的程序是否完成
跑了整三天的trim_galore程序,昨天晚上预计半夜会完成。所以早上起来 df了下,这个命令我习惯用,也没有出过错。 早上一看,硬盘没有写入活动,就确定可以进行下一步工作了。所以就mv了几个文件。但当我执行下一个程序的时候发现一个问题,OGM,虽然没有再写入磁盘的数据,但是程序好像仍然没有完结,有部分数据没有最终写入完成。 于是,马上top,确实没有结束,ps -ef很多命令仍然在执行中。 但为时已晚。 google没有找到类似这种问题。 于是,把僵尸数据处理掉,又找到其对应的源文件,修改后,重新来过。 所以 对于重要的文件要反复确认是否已经处理完成,或上传或下载完成。
Y大宽
2019/06/05
8640
如何查看可综合C代码的中间结果
采用Vivado HLS实现高层次综合时,Xilinx建议一定要提供相应的C测试文件。但C测试文件的弊端在于只能查看待综合顶层函数的输出,而对于子函数(顶层函数中调用的函数)或者其他一些中间变量的输出结果无能为力。如果C仿真有错误,这说明本身算法描述可能有问题。此时,尽管可以通过调用Debugger设置断点的方式跟踪数据处理结果,但从快速定位问题的角度而言,这种方法仍不够高效。如果可以打印出子函数或者中间变量的输出结果,那就可以实现快速粗定位。
Lauren的FPGA
2020/05/15
1K0
如何查看可综合C代码的中间结果
点击加载更多

相似问题

如何查看C++程序的汇编代码?

140

查看AVR汇编程序"hello world“代码

26

C++代码中的汇编程序代码

58

如何查看为C函数生成的汇编代码?

30

查看emacs中的函数汇编代码

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档