繁体   English   中英

将代码链接到exe时C ++程序崩溃,但是将代码编译到exe时工作正常,为什么呢?

[英]C++ program crashes when code is linked to exe but works fine when code is compiled into exe, how come?

我有一个可以在一个平台上长期运行的程序。 由于其成功,它将被移植到另一个平台。 没问题,我以为是因为它是用标准C ++编写的...

我的方法(用伪CMake进行说明):

  • 通过采购特定于平台的工具链来设置开发环境,以确保针对正确的平台
  • 将所有核心业务逻辑分解到一个应用程序对象中,并从该对象中构建一个库(来自相同源代码的每个平台的一个库):

     add_library(appLib STATIC app.cpp) target_link_libraries(appLib utilLib networkLib dbLib ${boostLibs}) 
  • 有一个main_a.cpp和另一个main_b.cpp,分别对平台a和b进行特定于平台的初始化,然后让main函数实例化应用程序对象。

     int main() { auto result = initAndDoPlatformStuff(); App app(result); app.run(); } 
  • 指示编译器和链接器汇编可执行文件:

     if (Platform_A) add_executable(appExe main_a.cpp) else() add_executable(appExe main_b.cpp) endif() target_link_libraries(appExe appLib) 

原则上,我猜这是一种完全有效的方法。 但实际上,它是行不通的。 在第二个程序崩溃后,崩溃几乎每次都不同。 检查核心转储时,它有时会在标准库中崩溃,有时会在boost库中以及我的代码中崩溃,但这是胡说八道。 程序似乎可以工作10次,但最终会崩溃。

但是,如果我使用完全相同的代码,则仅将其提取到其原始main.cpp文件中,然后以不同的方式将其构建在一起,如下所示:

int main()
{
    auto result = initAndDoStuff();
    processForever(result); // Business logic
}
add_executable(appExe main.cpp)
target_link_libraries(appExe utilLib networkLib dbLib ${boostLibs})

那就行了!

我感到困惑和困惑。 我怀疑它必须与代码布局有关,因此我尝试了PIC和PIE的不同变体,但没有成功。 有没有可用的工具可让您全面了解二进制代码的布局? 我知道nm,od,objdump,但是它们是低级的,我不知道要寻找什么...也许我无论如何都走错了路,也许问题与某些完全不同的问题有关。 是否有人会引起这种行为的任何预感? 我还能如何解决这个问题?

实际上,故障是我的。 当然...当我将代码重构为lib时,我确实尽力使所有细节正确无误,但显然我不够谨慎,在寻找问题时视而不见。
我最终发现的问题是,重构后我仍然将一个变量保留为局部变量,然后超出了范围,导致引用了已释放的内存,这导致了各种不确定的行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM