gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 07:22:45 25 4
gpt4 key购买 nike

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

//definition of at 
template<typename _Tp> inline const _Tp& Mat::at(int i0, int i1) const{
// ...
}

//my codes
cv::Mat eyePts_left;
// ...
if(std::max(eyePts_left.at<float>(0,0),eyePts_left.at<float>(16,0)) > eyePts_left.at<float>(61,0)){
//do something
}

我想打印表达式的值:
eyePts_left.at<float>(0,0)
在 lldb 调试 session 中,但它提示:
(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 可以将其输入到它的 clang 拷贝中,以便 clang 可以在表达式中正确解析它们。如您所见,目前这行不通。
但是,如果你真的需要这样做,你可以通过一些创造性的 Actor 来解决这个问题,例如:
查找函数地址,例如

(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
手动将调用转换到该地址:
(lldb) expr ((float &(*) (Mat *, int, int))0x0000000100003f30)(&my_mat, 10, 20)
Called with 10 20
(float) $0 = 30
这不是你真正的功能,只是我做的一个玩具,所以不要关注实际结果。
请注意,如果您最终经常这样做并且不是 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)

关于c++ - 如何在 gdb/lldb 调试中打印模板成员函数返回的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64602475/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com