如何在预编译后查看文件来调试Boost?

时间:2018-05-19 16:37:15

标签: c++ linux boost

我在使用boost这样定义测试套件时遇到了一个非常奇怪的错误:

BOOST_AUTO_TEST_SUITE(zerocoin_implementation_tests)

错误如下所示:

terminate called after throwing an instance of 'std::length_error'
  what():  basic_string::_M_create

以下是相关的回溯:

#5  0x00007ffff5ce6fe8 in __cxa_throw () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#6  0x00007ffff5ce2875 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#7  0x00007ffff5d7c949 in std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_create(unsigned long&, unsigned long) ()
   from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#8  0x00007ffff70afe15 in boost::unit_test::test_unit::test_unit(boost::unit_test::basic_cstring<char const>, boost::unit_test::basic_cstring<char const>, unsigned long, boost::unit_test::test_unit_type) () from /usr/lib/x86_64-linux-gnu/libboost_unit_test_framework.so.1.65.1
#9  0x00007ffff70b0456 in boost::unit_test::test_suite::test_suite(boost::unit_test::basic_cstring<char const>, boost::unit_test::basic_cstring<char const>, unsigned long) () from /usr/lib/x86_64-linux-gnu/libboost_unit_test_framework.so.1.65.1
#10 0x00007ffff70b0612 in boost::unit_test::ut_detail::auto_test_unit_registrar::auto_test_unit_registrar(boost::unit_test::basic_cstring<char const>, boost::unit_test::basic_cstring<char const>, unsigned long, boost::unit_test::decorator::collector&) ()
   from /usr/lib/x86_64-linux-gnu/libboost_unit_test_framework.so.1.65.1

据我所知,这与Boost尝试创建最大长度字符串有关。我想确切地看到它在做什么。什么是扩展boost宏以查看预编译版本的最佳方法?

旁注

奇怪的是,如果我将线路稍微改为:

BOOST_AUTO_TEST_SUITE(zerocsoin_implementation_tests)

我收到以下错误:

terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc

回溯:

#6  0x00007ffff5ce7594 in operator new(unsigned long) () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#7  0x00007ffff70afe15 in boost::unit_test::test_unit::test_unit(boost::unit_test::basic_cstring<char const>, boost::unit_test::basic_cstring<char const>, unsigned long, boost::unit_test::test_unit_type) () from /usr/lib/x86_64-linux-gnu/libboost_unit_test_framework.so.1.65.1
#8  0x00007ffff70b0456 in boost::unit_test::test_suite::test_suite(boost::unit_test::basic_cstring<char const>, boost::unit_test::basic_cstring<char const>, unsigned long) () from /usr/lib/x86_64-linux-gnu/libboost_unit_test_framework.so.1.65.1
#9  0x00007ffff70b0612 in boost::unit_test::ut_detail::auto_test_unit_registrar::auto_test_unit_registrar(boost::unit_test::basic_cstring<char const>, boost::unit_test::basic_cstring<char const>, unsigned long, boost::unit_test::decorator::collector&) ()
   from /usr/lib/x86_64-linux-gnu/libboost_unit_test_framework.so.1.65.1

可以在此处找到文件的源代码(以及项目的其余部分):https://github.com/phoreproject/Phore/blob/segwit/src/test/zerocoin_implementation_tests.cpp

可能导致错误的差异:https://github.com/phoreproject/phore/compare/master...segwit#diff-bb4f094cc636d668944ed6af9b72c0d9

1 个答案:

答案 0 :(得分:2)

两种方法:

异常断点

只需在调试器中启动测试并捕获异常。

在gdb中你可以做到

(gdb) catch throw 
Catchpoint 2 (throw)

就像一般断点。 Visual Studio有一个Manage Exeptions对话框.¹

提升测试断点

对于调试Boost测试,我喜欢在我想要破解的特定测试用例类的test_method成员处设置一个中断。例如。使用test_runner,它有几个嵌套套件,如:

./test_runner --list_content
import*
    utility*
        xml*
            xml_utilities*
            child_text_test*
            loggable_xml_path_test*

我们运行这三个测试,如:

./test_runner -t import/utility/xml
Running 3 test cases...

*** No errors detected

使用gdb调试它们我会做

gdb ./test_runner 
start -t import/utility/xml

哪个在main停止,然后我输入:

break import::utility::xml

自动完成有帮助,因此要获得确切的名称,您只需从完成中选择:

xml
xml::as_element(xmlpp::Node const&)
xml::attr_value(xmlpp::Element const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)
xml::attr_value(xmlpp::Node const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)
xml::child_text[abi:cxx11](xmlpp::Element const&, char const*)
xml::child_text_test
xml::child_text_test::test_method()
xml::child_text_test_invoker()
xml::child_text_test_registrar62
xml::end_suite94_registrar94
xml::first_child(xmlpp::Element const&, char const*)
xml::get_content[abi:cxx11](xmlpp::Element const&)
xml::get_content[abi:cxx11](xmlpp::Node const*)
xml::is_attr_value(xmlpp::Node const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)
xml::loggable_xml_path[abi:cxx11](xmlpp::Node const&)
xml::loggable_xml_path_test
xml::loggable_xml_path_test::test_method()
xml::loggable_xml_path_test_invoker()
xml::loggable_xml_path_test_registrar77
xml::trace_xml(xmlpp::Element const&, LogSource::LogTx)
xml::trace_xml_formatted(xmlpp::Element const&, LogSource::LogTx)
xml::xml_registrar20
xml::xml_utilities
xml::xml_utilities::test_method()
xml::xml_utilities_invoker()
xml::xml_utilities_registrar22

选择名为test_method()的名称,例如

break import::utility::xml::child_text_test::test_method() 
Breakpoint 2 at 0x730762: file /path/src/import/utility/xml_tests.cpp, line 62.

现在你可以continue执行,调试器将在你的单元测试开始时自动暂停执行。

¹另见