関数の戻り点(c/c++Only)をすばやく位置決めする方法
1790 ワード
関数の戻り点をすばやく位置決めする方法
関数の戻り点を迅速に特定する方法は、比較的短い精悍な関数にとって問題ではありませんが、LongFunctionという1000行長の関数があると仮定し、次のように呼び出します.
bool bSuccess = LongFunction();
assert(bSuccess);
実行中に2行目にassertがポップアップされ、LongFunctionの内部実行で何か問題が発生してfalseに戻ることを知っています.では、内部に何か問題が発生しましたか.どの行でエラーが発生して戻ってきたのですか.これは容易なことではないかもしれませんが、1000行の関数であり、多くの戻り点がある可能性が高いことを知っておく必要があります.これは私たちの日常の仕事でよくある問題だと思います.1000行の長関数はいくつかの大規模なシステムでは、古いコードの中では珍しくないと思います.もちろん、このような関数を再構築しなければならない理由は~~~(ここでは500字を省略)と強く考える友人もいます.確かに、再構築のメリットは明らかですが、リソース、時間、複雑さの考慮で採用されないことが多いので、ここでは再構築を考慮せずに、関数の戻り点を迅速に特定できる方法を見つけたいだけです.
著者らのDbgerは種々の可能な方法を解析した.考えがとてもいいです!見てみると、個人的には「戻る時に構造を分析する」方法が大好きです(残念ながらここはc++に有効です.C#は?さらに考える必要があります).コレクションは次のとおりです.
class ReturnMonitor
リソース管理ではよくこの方法(RAII)を使用しますが、関数が戻るときに構造関数という特性を呼び出し、構造関数にブレークポイントを設定するとcallstackで戻りポイントが表示されます.これには、LongFunction呼び出し中に異常が発生した場合にもキャプチャできるという利点もあります.
次のマクロを定義できます.
#ifdef _DEBUG
#define RETURN_MONITOR ReturnMonitor mon;
#else
#define RETURN_MONITOR
#endif
これにより、私たちのコードの中で比較的長い、デバッグしにくい長い関数に対して、関数の開始にRETURN_を加えることができます.MONITOR、releaseバージョンには影響しません.
var m = window.__blog.preRenderPosts; if (m) { m(); }
関数の戻り点を迅速に特定する方法は、比較的短い精悍な関数にとって問題ではありませんが、LongFunctionという1000行長の関数があると仮定し、次のように呼び出します.
1
bool bSuccess = LongFunction();
2
assert(bSuccess);
実行中に2行目にassertがポップアップされ、LongFunctionの内部実行で何か問題が発生してfalseに戻ることを知っています.では、内部に何か問題が発生しましたか.どの行でエラーが発生して戻ってきたのですか.これは容易なことではないかもしれませんが、1000行の関数であり、多くの戻り点がある可能性が高いことを知っておく必要があります.これは私たちの日常の仕事でよくある問題だと思います.1000行の長関数はいくつかの大規模なシステムでは、古いコードの中では珍しくないと思います.もちろん、このような関数を再構築しなければならない理由は~~~(ここでは500字を省略)と強く考える友人もいます.確かに、再構築のメリットは明らかですが、リソース、時間、複雑さの考慮で採用されないことが多いので、ここでは再構築を考慮せずに、関数の戻り点を迅速に特定できる方法を見つけたいだけです.
著者らのDbgerは種々の可能な方法を解析した.考えがとてもいいです!見てみると、個人的には「戻る時に構造を分析する」方法が大好きです(残念ながらここはc++に有効です.C#は?さらに考える必要があります).コレクションは次のとおりです.
class ReturnMonitor
2
{ 3
~ReturnMonitor(){} 4
}; 5
struct LongFunction() 6
{ 7
ReturnMonitor mon; 8
//Function body 9
} リソース管理ではよくこの方法(RAII)を使用しますが、関数が戻るときに構造関数という特性を呼び出し、構造関数にブレークポイントを設定するとcallstackで戻りポイントが表示されます.これには、LongFunction呼び出し中に異常が発生した場合にもキャプチャできるという利点もあります.
次のマクロを定義できます.
1
#ifdef _DEBUG
2
#define RETURN_MONITOR ReturnMonitor mon;
3
#else
4
#define RETURN_MONITOR
5
#endif
これにより、私たちのコードの中で比較的長い、デバッグしにくい長い関数に対して、関数の開始にRETURN_を加えることができます.MONITOR、releaseバージョンには影響しません.
var m = window.__blog.preRenderPosts; if (m) { m(); }