【问题标题】:how to print value returned by template member function in gdb/lldb debugging如何在 gdb/lldb 调试中打印模板成员函数返回的值
【发布时间】:2021-02-12 13:37:10
【问题描述】:

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

//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 调试会话中,但它抱怨:

(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)
               ~~~~~^

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

【问题讨论】:

    标签: c++ templates debugging lldb


    【解决方案1】:

    当前模板函数和模板化实体的调试信息通常很尴尬,因为它只将实例描述为抽象实体,而不是将模板描述为抽象实体,因此模板化函数只是在调试信息中显示为带有尖括号的函数名字。这使得从调试信息到编译器表示变得棘手,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
    

    手动将呼叫发送到该地址:

    (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)
    

    【讨论】:

    • 对不起,这太可怕了?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-11
    • 2017-09-06
    • 1970-01-01
    • 2011-08-31
    • 2018-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多