【问题标题】:Is this gdb core occured by violation of ODR(One Definition Rule)?这个 gdb 核心是否违反了 ODR(一个定义规则)?
【发布时间】:2021-12-08 19:13:02
【问题描述】:

我正在使用代码在我的服务器应用程序中包含 rapidjson 标头。 当我编译时,它是好的。但是当应用程序中的一些其他库部分正在运行时,它被 gdb 核心文件证明是死的。

#0  0x00007f36c614e922 in rapidjson::MemoryPoolAllocator<rapidjson::CrtAllocator>::Malloc (this=0x7f36a4037700, size=256) at ../../common/include/rapidjson/allocators.h:321
321             RAPIDJSON_NOEXCEPT_ASSERT(shared_->refcount > 0);
...
#17 0x00007f36c57999cb in dbgw::sql::NBaseTPreparedStatement::executeQuery (this=<optimized out>) at ../../src/dbgw/dbgw3/sql/nbase_t/NBaseTPreparedStatement.cpp:85

我意识到动态库实际上已经有rapidjson 在我看到下面这个之后,我通过将命名空间添加到新添加的rapidjson 来解决

https://rapidjson.org/group___r_a_p_i_d_j_s_o_n___c_o_n_f_i_g.html#ga743a79d3af927391fe3eb5c979136899

所以我很好奇的是……

Q1.这是因为多个包含违反了 ODR,共享库意外(因为覆盖符号的东西)运行了新添加的(可能是不同版本的)rapidjson 代码,并导致抛出异常?

第二季度。我可以假设编译时没有发生previous declaration 错误的原因是它是“共享”库并且仅在应用程序运行时才链接?(与静态库不同)

【问题讨论】:

    标签: c++ gdb shared-libraries coredump one-definition-rule


    【解决方案1】:

    这是因为多个包含违反了 ODR,共享库意外(因为覆盖符号的东西)运行了新添加的(可能是不同版本的)rapidjson 代码,并导致抛出异常?

    这可能是原因,但你提供的细节太少了。

    我可以假设编译时没有发生先前声明错误的原因是它是“共享”库并且仅在应用程序运行时才链接?(与静态库不同)

    可能不会。 “先前的声明”是一个编译时间错误,你不会期望这里有一个(带有单独的翻译单元)。

    您可能要问的是“为什么没有发生多定义链接错误?”。如果是这样,是的:在主可执行文件和它正在使用的一个(或多个)共享库中具有相同的符号定义不是错误。这实际上很常见,并且允许应用程序使用不同的 malloc 实现,尽管 malloclibc 中。

    【讨论】:

    • 谢谢。 “您可能要问的是“为什么没有发生多定义链接错误?”。如果是这样,是的“是的!那是我的要求。你能告诉我这些问题我应该附上什么样的细节吗? (下次)无论如何,再次感谢!
    猜你喜欢
    • 2021-06-19
    • 2016-10-20
    • 2020-04-11
    • 1970-01-01
    • 2014-02-15
    • 2010-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多