ある種の独特な状況があります。私は電子メールを送信するためのオープンソースライブラリに取り組んできました。このライブラリでは、呼び出し元のメソッドを取得するための信頼できる方法が必要です。私はその中のオブジェクトをStackTrace
分析することによってこれを行いました。StackFrame
これは、最適化がオフになっているデバッグモードプロジェクトでは問題なく機能します。
この問題は、最適化がオンになっているリリースモードに切り替えると発生します。スタックトレースは次のようになります。
> FindActionName at offset 66 in file:line:column <filename unknown>:0:0
> Email at offset 296 in file:line:column <filename unknown>:0:0
> CallingEmailFromRealControllerShouldFindMailersActionName at offset 184
in file:line:column <filename unknown>:0:0
> _InvokeMethodFast at offset 0 in file:line:column <filename unknown>:0:0
> InvokeMethodFast at offset 152 in file:line:column <filename unknown>:0:0
...
これは、失敗した単体テストから取得されます。このトレースの3行目には、TestEmail
他の場所で定義されているというメソッドが表示されているはずですが、JITterがそれをインライン化していると思います。メソッドを仮想化することでインライン化を防ぐことができると読みましたが、これは機能しません。メソッドのインライン化を防ぎ、メソッドがスタックトレースに表示されるようにするための、信頼できる方法を知っている人はいますか?