C++ 什么';在OSX上,从dock启动进程与从命令行启动进程的区别是什么

C++ 什么';在OSX上,从dock启动进程与从命令行启动进程的区别是什么,c++,macos,dynamic-linking,dylib,dyld,C++,Macos,Dynamic Linking,Dylib,Dyld,我正在调试OSX上的一个问题,该问题仅在应用程序从dock启动时发生。从命令行启动应用程序时不会发生这种情况。这两种情况的区别是什么?我正在使用的代码是一个基于C++的捆绑式插件,它被加载到第三方应用程序中。在这两种情况下,我都使用GDB连接了进程,我能看到的唯一区别是,当从命令行运行时,进程中加载了两个额外的dylib,并且我的库的基址在这两种情况下略有不同。我尝试在加载时将链接更改为-prebind和/或-bind\u,但没有效果。一个重要的区别是,在每种情况下,初始工作目录都会不同。应用程

我正在调试OSX上的一个问题,该问题仅在应用程序从dock启动时发生。从命令行启动应用程序时不会发生这种情况。这两种情况的区别是什么?我正在使用的代码是一个基于C++的捆绑式插件,它被加载到第三方应用程序中。在这两种情况下,我都使用GDB连接了进程,我能看到的唯一区别是,当从命令行运行时,进程中加载了两个额外的dylib,并且我的库的基址在这两种情况下略有不同。我尝试在加载时将链接更改为-prebind和/或-bind\u,但没有效果。

一个重要的区别是,在每种情况下,初始工作目录都会不同。应用程序不应该对工作目录做任何假设,如果他们这样做,就会以有趣的方式中断。

从Dock图标启动的应用程序不会拾取您正在使用的shell中可能设置的相同环境变量。如果您依赖于从环境中获取一些东西,那么您需要寻找一种不同的方法。您将获得一些env变量,如PATH、HOME、LOGNAME等。但是如果您要查找HOSTTYPE、LANG、OSTYPE等,它们将不会出现。

在这种情况下,我的问题是由于加载共享库的顺序不同造成的。我们的应用程序使用的第三方库之一将扩展库加载到全局命名空间中。与同一库的不同版本存在符号冲突。扩展库加载到全局池的顺序会根据应用程序是从文档还是从命令行启动而变化。

在类似情况下,从应用程序包运行时会发生崩溃。一种可能是我们正在使用已经释放的内存。例如,在
free()
delete
之后使用类的指针或字段

看起来应用程序捆绑包与另一个
free/delete
实现动态链接,该实现将释放的内存归零/修改


使用其他平台/编译器(例如Linux/gcc、Windows/Visual Studio、命令行中的macOS/clang)可能不会出现这种错误,只有在从应用程序包(Finder/dock中的macOS/clang)执行程序时才会出现这种错误。

如果您能告诉我们a.问题是什么,B.预期的行为是什么,C.实际发生的事情。这个问题本身是有效的:“从dock启动进程与在OS X上从命令行启动进程有什么区别”,不管Josh经历了什么。不幸的是,我在这里以“中间人”的身份帮助我们的一个合作伙伴解决他们库的问题。。。当然,我没有代码:)我花了一些时间来获得更好的细节。具体来说,对于unicode“右单引号”字符,icu4c中的“unorm_normalize”函数返回错误,但只有在从dock启动应用程序时才会返回。根据更多调查,我开始认为问题是内存损坏问题和“仅从dock”症状是转移注意力。虽然这在我的工作目录中似乎不是问题,但当我试图想出可能的方法时,不同的工作目录肯定是我看过的。谢谢你的提示!