使用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&) ()
答案 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(或任何其他类型)时,一切对我有用 >。