Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在gdb/lldb调试中打印模板成员函数返回的值_C++_Templates_Debugging_Lldb - Fatal编程技术网

C++ 如何在gdb/lldb调试中打印模板成员函数返回的值

C++ 如何在gdb/lldb调试中打印模板成员函数返回的值,c++,templates,debugging,lldb,C++,Templates,Debugging,Lldb,OpenCV的类cv::Mat中有一个名为at的模板成员函数: //at的定义 模板内联常量&Tp&Mat::at(inti0,inti1)常量{ // ... } //我的密码 cv::Mat eyePts_左; // ... 如果(std::max(eyePts_left.at(0,0),eyePts_left.at(16,0))>eyePts_left.at(61,0)){ //做点什么 } 我要打印表达式的值: eyePts_left.at<float>(0,0) eye

OpenCV的类
cv::Mat
中有一个名为
at
的模板成员函数:

//at的定义
模板内联常量&Tp&Mat::at(inti0,inti1)常量{
// ...
}
//我的密码
cv::Mat eyePts_左;
// ...
如果(std::max(eyePts_left.at(0,0),eyePts_left.at(16,0))>eyePts_left.at(61,0)){
//做点什么
}
我要打印表达式的值:

eyePts_left.at<float>(0,0)
eyePts_左位(0,0)
在lldb调试会话中,但它抱怨:

(lldb) p eyePts_left.at<float>(0, 0)
error: warning: warning: got name from symbols: at
error: <user expression 21>:1:13: no member named 'at' in 'cv::Mat'
eyePts_left.at<float>(0, 0)
~~~~~~~~~~~ ^
error: <user expression 21>:1:21: expected '(' for function-style cast or type construction
eyePts_left.at<float>(0, 0)
               ~~~~~^
(lldb)p左眼点位于(0,0)
错误:警告:警告:从符号获取名称:在
错误::1:13:在“cv::Mat”中没有名为“at”的成员
在(0,0)处的左眼点
~~~~~~~~~~~ ^
错误::1:21:函数样式转换或类型构造应为“(”
在(0,0)处的左眼点
~~~~~^

那么,检查此模板相关表达式的值的正确方法是什么呢?

模板函数和模板化实体的当前调试信息通常很尴尬,因为它只描述实例化,而不将模板描述为抽象实体,因此模板化函数只会显示在调试信息中,就像具有名称中的尖括号。这使得从调试信息转换为编译器表示形式变得很困难,lldb可以将其输入到clang的副本中,以便clang可以在表达式中正确解析它们。正如您所发现的,这目前不起作用

但是,如果您确实需要这样做,您可以通过一些创造性的铸造来解决这个问题,例如:

查找函数地址,例如

(lldb) image lookup -n Mat::at<float>
1 match found in /tmp/a.out:
        Address: a.out[0x0000000100003f30] (a.out.__TEXT.__text + 64)
        Summary: a.out`float const& Mat::at<float>(int, int) at template_fun.cpp:4
这不是你真正的功能,只是我做的一个玩具,所以不要关注实际结果

注意,如果您经常这样做,并且不100%喜欢C函数转换语法,您可以在代码或lldb中为其创建typedef,如:

(lldb) expr typedef float &(*$Mat_at_type) (Mat *, int, int)
这简化了通话:

(lldb) expr (($Mat_at_type)0x0000000100003f30)(&my_mat, 10, 20)
Called with 10 20
(float) $1 = 30
如果你经常这样做,你甚至可以:

(lldb) command alias call_at expr -- (($Mat_at_type)0x0000000100003f30)
(lldb) call_at (&my_mat, 10, 20)
对不起,这太可怕了
(lldb) command alias call_at expr -- (($Mat_at_type)0x0000000100003f30)
(lldb) call_at (&my_mat, 10, 20)