24

NSLog以外に、OS Xでスクリーンセーバーアプリバンドルを適切にデバッグするための適切な方法があるかどうか疑問に思っていましたか?

「スクリーンセーバー」はXcodeのプロジェクトタイプですが、BuildandGoのデバッグは明らかにありません。さらに、実際に私のバンドルがロードされていることがわかりました

/System/Library/Frameworks/ScreenSaver.framework/Versions/A/Resources/ScreenSaverEngine.app 

ある種のプラグインとしてのアプリケーション。

それで、あなたのコードをデバッグするためのまともな方法はありますか?クラッシュレポートとコンソールへのNSLogingを確認することは役に立ちますが、完璧にはほど遠いです。

4

9 に答える 9

16

スクリーン セーバーの開発サイクルについて説明している古いMacTech記事があります。記事にはパート 2もあります。「デバッグのヒント」セクションを参照してください。

この方法は面倒なので、アプリケーションを作成しました。基本的なアプリケーションは、新しいスクリーンセーバー バンドルで ScreenSaverView を初期化する 1 つのウィンドウとコントローラーでした。それが機能したら、変更をテストするために私がしなければならなかったことは、Xcode で Command-R を押すことだけでした。

于 2009-07-09T13:48:24.957 に答える
8

OS X 10.11 El Capitan の System Integrity Protection 機能のため、デバッガーは から実行されているものには接続できません/System/。また、ここにあるその他の情報は、古いバージョンの Xcode に適用されます。

Xcode 7.2を使用してEl Capitanで動作させる方法は次のとおりです。

  1. にコピー/System/Library/Frameworks/ScreenSaver.framework/Versions/A/Resources/ScreenSaverEngine.app//tmp/ます。(.xcscheme は完全修飾パスを参照するため、特定のユーザーのホーム ディレクトリのどこかにコピーするのではなく、共通の場所にコピーするのがコラボレーションに最適です。)
  2. プロジェクトの編集.xcscheme:
    • 実行アクションの実行可能ファイルをコピーしたアプリに設定し、次の引数を追加します-debug -background -module "<product-name>"(ここで、拡張子<product-name>を除いたバンドル名)。.saver
    • プレアクション スクリプト (以下のソース) を追加し、シェルを に設定し/bin/bash、ビルド設定をスキームから取得します。.saverビルドされたバンドルへのシンボリックリンクを作成します~/Library/Screen Savers/

ソース:

SCREEN_SAVER_PATH="${HOME}/Library/Screen Savers/${FULL_PRODUCT_NAME}"
if [[ -d "${SCREEN_SAVER_PATH}" || -f "${SCREEN_SAVER_PATH}" || -L "${SCREEN_SAVER_PATH}" ]]; then
    rm -Rf "${SCREEN_SAVER_PATH}"
fi
ln -s "${BUILT_PRODUCTS_DIR}/${FULL_PRODUCT_NAME}" "${SCREEN_SAVER_PATH}"

これで、Xcode の [実行] ボタンを押すと、スクリーン セーバーがデスクトップの壁紙モードで実行され、デバッガーを使用できるようになります。

于 2016-01-21T16:27:56.257 に答える
6

プラグインをロードするアプリケーションを実行することにより、プラグインをデバッグできます。

したがって、スクリーンセーバーをデバッグするには、プラグインプロジェクトを開き、[プロジェクト]メニューから[新しいカスタム実行可能ファイル]を選択して、アプリケーションをスクリーンセーバーエンジンに設定します。

スクリーンセーバーをデバッグする場合は、2台目のMacを使用し、リモートデバッグを使用して、ユーザーインターフェイスのアクションがスクリーンセーバーに干渉しないようにすることもできます。

于 2009-07-09T13:20:33.883 に答える
3

スクリーン セーバーを実行する Mac OS X アプリがいくつかあります: SaverLab、Screenalicious など。Web 上でそのうちの 1 つを見つけてダウンロードし、それをターゲット実行可能ファイルとして設定するだけです (Peter N Lewis が言ったように)。

各ビルド後にビルド製品を '~/Library/Screen Savers/' にコピーしないようにするには、カスタム ビルド スクリプトを追加します (注: シェルに '/bin/tcsh -x' を使用しています):

#remove the old screen saver or link
rm -Rf "${SCRIPT_OUTPUT_FILE_0}"

#if this is a debug build…
if ("${CONFIGURATION}" == "Debug" ) then

# create a symbolic link from our screen saver to this users screen saver directory
ln -sfv "${SCRIPT_INPUT_FILE_0}" "${SCRIPT_OUTPUT_FILE_0}"

#if this is a release build…
else if ("${CONFIGURATION}" == "Release" ) then

# copy our screen saver to this users CMM directory
cp -Rfv "${SCRIPT_INPUT_FILE_0}" "${SCRIPT_OUTPUT_FILE_0}"

endif

次に、入力ファイルを「${BUILT_PRODUCTS_DIR}/${FULL_PRODUCT_NAME}」に、出力ファイルを「${HOME}/Library/Screen Savers/${FULL_PRODUCT_NAME}」に設定します。

プロジェクトをビルド/実行すると、自動的にデバッグ ビルドにリンクされるか、リリース ビルドがコピーされます。

于 2012-02-12T02:33:16.630 に答える
2

Peter が言うように、プラグインをロードするアプリケーションを実行することで、プラグインをデバッグできます。

ただし、スクリーンセーバー エンジンを使用する代わりに、システム設定を使用することもできます。設定が表示されたら、「デスクトップとスクリーンセーバー」の下のスクリーンセーバーに移動して、プラグインを読み込みます。

ビューがフルサイズではないので完璧ではありませんが、リモート デバッグを設定するよりは簡単です。

于 2009-07-18T10:25:05.467 に答える
1

必ずしも最良の方法ではありませんが、別のマシンから SSH 接続し、gdb から ScreenSaverEngine を起動できます (未テスト)。

編集

また、新しいアプリケーション ターゲットを追加して、ScreenSaverView を IB のウィンドウに追加することもできます。設定などを手動で構成する必要がある場合がありますが、ScreenSaverView は NSView のサブクラスであるため、一部は役立つ可能性があり、おそらく問題なく動作するはずです。

于 2009-07-09T05:15:29.453 に答える
0

ScreenSaverEngine アプリのコピーを作成し、開発者 ID で署名すると、システム整合性保護によってデバッガーの接続が妨げられる状況が修正されます。実行可能ファイルを自分の署名付きコピーに設定してください。

于 2016-08-12T18:54:44.003 に答える
0

@Karlのソリューションが私にとって最もうまくいったことに注意したいと思います。ただし、あなたが私のようで、毎晩コンピューターを再起動する場合は、次のものを配置することを検討することをお勧めします。

cp -Rn /System/Library/CoreServices/ScreenSaverEngine.app /tmp

彼の回答に記載されているビルド前のシェルスクリプトの冒頭。これにより、コピー手順が自動的に実行されます。

(これは本当にコメントに属していると思いますが、私の経験値はまだ十分ではありません)

于 2019-04-09T15:44:57.740 に答える