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

get Segmentation fault in GMock API GetValueAndDelete()

本文关键字:获取 分段 错误 GMock API GetValueAndDelete      更新时间:2023-10-16

我在使用 gmock 时遇到一个奇怪的问题,一个线程在GetValueAndDelete()中出现分段错误,检查 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&) ()

正如SoronelHaetil提到的,你的帖子不够准确,无法给出答案,所以我会尝试给你一些可能的解决方案。

您在使用 GMock 时面临的问题可能由于以下几个原因而出现:

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

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

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

    如果是这种情况,请尝试使用以下命令来设置 sysroot 或帮助 gdb 找到正确的库:"setsolib-search-path">">set sysroot"。在尝试添加命令 bt之前执行此操作。

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