在GMock API中获取分段错误GetValueAndDelete()

时间:2018-01-09 08:35:17

标签: c++ gmock

使用gmock时遇到一个奇怪的问题,一个线程在GetValueAndDelete()中得到一个Segmentation错误,检查gmock代码,这个函数很简单:

template <>
class ActionResultHolder<void> : public UntypedActionResultHolderBase {
 public:
  void GetValueAndDelete() const { delete this; }
......

如何分割错误?

stack info
Program received signal SIGSEGV, Segmentation fault.
0x000000000049c0da in testing::internal::ActionResultHolder<void>::GetValueAndDelete() const ()
(gdb) bt
#0  0x000000000049c0da in testing::internal::ActionResultHolder<void>::GetValueAndDelete() const ()
#1  0x000000000049c194 in TestServerPolicyMock::start_accept(std::error_code&) ()

1 个答案:

答案 0 :(得分:0)

正如SoronelHaetir提到的那样,您的帖子不够准确,无法给出答案,因此,我将尝试为您提供一些可能的解决方案。

使用GMock时遇到的问题可能由于以下几个原因而引起:

  • GMock尝试访问的对象已被删除或破坏,在这种情况下,它可能引发分段错误。

  • 正如您提到的,有一个特定的线程引发此分段错误,另一个原因可能是,当尝试使用GMock和GDB时, GDB 本身可能是尝试启动多个线程时,找不到合适的库,在启动时会出现下一条消息:

    warning: Unable to find libthread_db matching inferior's thread library, thread debugging will not be available.
    

    在这种情况下,请尝试使用以下命令来设置sysroot或帮助gdb查找合适的库: set solib-search-path 设置系统根目录。在尝试添加 bt 命令之前,先 执行此操作。

  • 就我而言,使用 void()返回方法使我在尝试将其与GMock集成时遭受了一点痛苦,特别是为 ARM 编译时>。在为返回的方法设置期望值时,总是会抛出void()分段错误,就像您的情况一样。 但是,我真的不知道为什么,我认为应该在某处进行报告,将返回类型更改为bool(或任何其他类型)时,一切对我有用 >。