如何在LLDB中查看std::optional包裹的boost::beast::ssl_stream对象
解决LLDB中查看std::optional包裹的boost::beast::ssl_stream对象的问题
问题场景
尝试打印的目标类型为std::optional包裹的boost::beast::ssl_stream,具体类型定义:
boost::beast::ssl_stream<boost::beast::basic_stream<boost::asio::ip::tcp, boost::asio::any_io_executor, boost::beast::unlimited_rate_policy>>
可以正常打印std::optional包装器本身:
(lldb) p ssl_stream_
(std::optional<boost::beast::ssl_stream<boost::beast::basic_stream<boost::asio::ip::tcp, boost::asio::any_io_executor, boost::beast::unlimited_rate_policy> > >) $6 = Has Value=true { Value = { p_ = boost::beast::flat_stream<boost::asio::ssl::stream<boost::beast::basic_stream<boost::asio::ip::tcp, boost::asio::any_io_executor, boost::beast::unlimited_rate_policy> > > @ 0x0000000103a04080 { __value_ = 0x0000000103a04080 } } }
但尝试查看内部的boost对象时,执行value()或解引用操作会触发重载歧义报错:
(lldb) p ssl_stream_.value()
error: expression failed to parse: error: <user expression 12>:1:13: call to member function 'value' is ambiguous ssl_stream_.value() ~~~~~~~~~~~~^~~~~ note: candidate function note: candidate function
(lldb) p *ssl_stream_
error: expression failed to parse: error: <user expression 13>:1:1: use of overloaded operator '*' is ambiguous (operand type 'std::optional<boost::beast::ssl_stream<boost::beast::basic_stream<boost::asio::ip::tcp, boost::asio::any_io_executor, boost::beast::unlimited_rate_policy>>>') *ssl_stream_ ^~~~~~~~~~~~ note: candidate function note: candidate function
解决方法
- 直接访问optional内部成员
从之前的打印结果可以看到,std::optional的内部值存储在Value字段中,直接访问该字段即可:
(lldb) p ssl_stream_->Value
如果需要深入查看嵌套成员,还可以直接通过输出中的内存地址打印:
(lldb) p *(boost::beast::ssl_stream<boost::beast::basic_stream<boost::asio::ip::tcp, boost::asio::any_io_executor, boost::beast::unlimited_rate_policy>>*)0x0000000103a04080
- 使用frame variable命令绕过表达式解析
LLDB的frame variable(缩写fr v)直接读取内存,不会触发C++表达式的重载解析,避免歧义:
(lldb) fr v ssl_stream_.Value
若要展开所有嵌套成员,添加-d run参数:
(lldb) fr v -d run ssl_stream_.Value
内容的提问来源于stack exchange,提问作者Zohar81
相关产品推荐
相关产品推荐

