ドックからプロセスを開始する場合と、ドックからプロセスを開始する場合の違いは何ですか。OS X のコマンドライン

StackOverflow https://stackoverflow.com/questions/2553706

質問

アプリケーションがドックから起動された場合にのみ発生する OS X の問題をデバッグしています。アプリがコマンド ラインから起動された場合、この問題は発生しません。2 つのシナリオの違いは何ですか?私が作業しているコードは、サードパーティのアプリに読み込まれる C++ ベースのバンドル プラグインです。どちらのシナリオでも GDB を使用してプロセスにアタッチしましたが、唯一の違いは、コマンド ラインから実行するとプロセスにいくつかの追加の dylib が読み込まれることと、ライブラリのベース アドレスがコマンド ラインでわずかに異なることです。 2つのシナリオ。リンケージを -prebind および/または -bind_at_load に変更しようとしましたが、無駄でした。

役に立ちましたか?

解決

一つの重要な違いは、最初の作業ディレクトリは、それぞれの場合に異なるものになるということです。アプリケーションは、作業ディレクトリについての仮定を行うべきではありません、彼らがしなければ興味深い方法で解除されます。

他のヒント

Dockアイコンから起動されたアプリケーションは、あなたが使用しているシェルで設定することができると同じ環境変数を拾うことはありません。あなたは環境から何かを拾うに頼っている場合は、別のアプローチを探したいと思うでしょう。あなたはHOSTTYPE、LANG、OSTYPE、らを探している場合は、それらが存在するつもりはないなどPATH、HOME、LOGNAME、同様に、varsはしかしENVの一部を取得します。

この場合、私の問題は、共有ライブラリがロードされる順序で違いによって引き起こされました。私たちのアプリケーションがグローバル名前空間にロードする拡張ライブラリを使用するサードパーティのライブラリのひとつ。その同じライブラリの異なるバージョンと記号の競合がありました。拡張ライブラリは、グローバルプールにロードされる順序は、アプリがドキュメントまたはコマンドラインから開始されたかどうかに基づいて変化します。

同様の状況で、アプリバンドルから実行するとクラッシュが発生します。可能性の 1 つは、すでに割り当てを解除したメモリを使用していることです。例えば。後でクラスのポインタまたはフィールドを使用する free() または delete.

App Bundle が別のバンドルに動的にリンクされているようです free/delete 割り当て解除されたメモリをゼロにする/変更する実装。

この種のバグは、他のプラットフォーム/コンパイラーを使用すると発生しない可能性があります (例:Linux/gcc、Windows/Visual Studio、macOS/clang (コマンド ラインから))、プログラムがアプリ バンドルから実行された場合にのみ表示されます (Finder/dock から macOS/clang)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top