問題タブ [mach]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
macos - Delphi - OSX で完全なスタック トレースを取得する
後でデバッグに使用できるスタックトレースをログに記録できるアプリケーションがあります。
Windows では、JEDI プロジェクトが提供する優れた JCLDebug ユニットを使用して取得しました。
アプリケーションが OSX で実行されるようになったので、ちょっと問題が発生しました。例外が発生したときに正しいスタック トレースを取得する方法がわかりません。
私は基本を理解しています -
1) 「backtrace」を使用してスタックトレースを取得できます (libSystem.dylib にあります)
2) 結果のバックトレースは、Delphi のリンカーが提供する .map ファイルを使用して行番号に変換できます。
私が残した問題は、どこからバックトレースを呼び出すべきかわからないということです。Delphi が(別のスレッドで)Mach 例外を使用していること、および posix シグナルを使用できないことは知っていますが、これですべて解決できました。
「try...except」ブロックでバックトレースを取得できますが、残念ながら、その時点でスタックはすでに縮小されています。
例外が発生した直後に実行される適切な例外ロガーをインストールするにはどうすればよいですか?
アップデート:
「Honza R の提案に従って、「GetExceptionStackInfoProc」プロシージャを調べました。
この機能により、例外処理プロセスの「内部」に入ることができますが、残念ながら、以前と同じ問題がいくつか残っています。
まず第一に、デスクトップ プラットフォームでは、この関数 'GetExceptionStackInfoProc' は単なる関数ポインターであり、独自の例外情報ハンドラーで割り当てることができます。そのため、すぐに使用できる Delphi は、スタック情報プロバイダーを提供しません。
関数を「GetExceptionStackInfoProc」に割り当て、その中で「バックトレース」を実行すると、スタックトレースを受け取りますが、そのトレースは、例外の原因となったスレッドではなく、例外ハンドラに関連しています。
「GetExceptionStackInfoProc」には「TExceptionRecord」へのポインタが含まれていますが、これに関するドキュメントは非常に限られています。
私は自分の深さを超えているかもしれませんが、正しいスレッドからスタックトレースを取得するにはどうすればよいですか? 独自の「バックトレース」関数を例外ハンドラーに挿入し、そこから標準の例外ハンドラーに戻ることは可能でしょうか?
更新 2
いくつかの詳細。1 つ明確にしておくべきことがあります。この質問は、RTL 内で完全に処理されるソフトウェア例外ではなく、MACH メッセージによって処理される例外に関するものです。
エンバカデロは、これらの機能とともにいくつかのコメントを発表しました -
私が抱えている問題の原因のようです。
この例外システムが制御を RTL に渡した後にスタックトレースを実行すると、次のようになります。完了)
RaiseSignalException
によって呼び出されるため、libc によって提供される関数は、スタックに加えられた変更と互換性がないSignalConverter
と考えるようになりました。backtrace
そのため、そのポイントを超えてスタックを読み取ることはできませんが、スタックはまだその下に存在しています。
それについて何をすべきか(または私の仮説が正しいかどうか)を知っている人はいますか?
アップデート 3
私はついにOSXで適切なスタックトレースを取得することができました. Honza と Sebastian の両方に感謝します。両方のテクニックを組み合わせることで、うまくいくものを見つけました。
これから恩恵を受ける可能性のある他の人のために、ここに基本的なソースがあります. 100% 正しいかどうかはわかりませんが、改善を提案できる場合は、どうぞ。この手法は、Delphi が障害のあるスレッドのスタックをアンワインドする直前に例外にフックし、事前に発生した可能性のあるスタック フレームの破損を補償します。
macos - カーネル拡張機能からユーザー空間を切断する方法 (カーネル側)
現在サポートしているカーネル拡張では、ソケットを使用してユーザー空間と通信します。したがって、いくつかのコールバックをサブスクライブし、それらを正しく処理します
すべてが期待どおりに機能します。1 つだけ問題があります - 接続されているユーザー空間クライアントがある場合、カーネル拡張機能をアンロードできません (ctl_deregister(kctlref) がエラーを返します)。
カーネル拡張機能でそれをオーバーライドする方法はありますか? すべてのクライアントから切断し、自分自身を正常に登録解除したい
macos - kext からの新しいプロセスの作成を購読し、このプロセスの pid を取得します
kext で新しく作成されたプロセスに関する通知を取得しようとしています。Get process creation notification in Mac OS Xによると、KAUTH_FILEOP_EXEC に登録しました
しかし、何らかの奇妙な理由で、vnode とファイル名 ( https://developer.apple.com/library/mac/technotes/tn2127/_index.html ) の 2 つの引数しか使用できません。
プロセスはその時点ですでに作成されていて、pid を持っているはずですが、カーネルはそれを私に与えません。
この時点でpidを取得することは可能ですか?
kext からの新しいプロセスの作成をサブスクライブし、このプロセスの pid を取得する他の方法はありますか?
iphone - iPhone のマッハ例外
次の例外が発生することがあります。
これらの例外が何であるかはわかりません。誰かがこれに光を当てることができますか?
objective-c - OS X 10.6 で NSConnection を使用した IPC
IPC を使用して相互に通信する 2 つのアプリを開発しました。サーバー側とクライアント側のコードは次のとおりです。
サーバ:
クライアント:
問題は、OS X 10.6 で動作しないことです。ただし、10.7、10.8、および 10.9 では完全に動作します。10.6 で受け取るエラーは次のとおりです。
__NSAutoreleaseNoPool(): クラス NSCFDictionary のオブジェクト 0x10031a0f0 がプールなしで自動解放されました - ちょうどリークしています
__NSAutoreleaseNoPool(): クラス NSCFArray のオブジェクト 0x100330b50 がプールなしで自動解放されました - リークしているだけです
その結果、クライアントは適切な値を渡しません。