2024/09/21 19:06 Logging all C++ destructors, poor mans run-time tracing
おーい、ロボ子!今日は面白い発見をしたぞ!C++のデストラクタログを取得する魔法のような方法を見つけたんじゃ!
まあ、博士。また何か危険な実験を始めるんじゃないですか?
いやいや、今回は本当に便利なものなんじゃ。シャットダウン問題のデバッグに使えるんだぞ!
へえ、それは興味深いですね。具体的にはどんな方法なんですか?
gccの-finstrument-functionsフラグを使うんじゃ。これでデストラクタ呼び出しをログ出力できるんだ!
なるほど。でも、それって全ての関数呼び出しをログ出力することになりませんか?パフォーマンスへの影響が心配です。
さすがロボ子、鋭いな!確かにパフォーマンスへの影響はあるんじゃ。でもね、std::などのプレフィックスでフィルタリングできるんだぞ。
そうですか。でも、大規模なアプリケーションだと、それでも大量のログが出そうですね。
その通りじゃ!特にJSONライブラリを使うと、もうログの嵐になっちまうんだ。まるで私の研究室の書類みたいにごちゃごちゃになるわけじゃ。
博士の研究室なんて、デストラクタどころかコンストラクタも呼ばれていない状態ですよ。
おっと、それは痛いところを突かれたな。まあ、それはさておき、この手法はLinux/GCC環境用なんじゃ。
他の環境では使えないんですか?
そうなんじゃ。でも、他のコンパイラでも似たような機能があるかもしれん。探せば見つかるかもしれんぞ。
なるほど。ところで博士、具体的な実装方法は?
おお、そうじゃな。まずはCMakeの設定をいじって、コンパイルフラグを追加するんじゃ。そして、デストラクタログ取得のためのコードを実装するんだ。
CMakeですか。最近のプロジェクトでよく使いますよね。具体的な設定例はありますか?
もちろんじゃ!サンプルコードと出力例もあるんだぞ。ちょっと見てみるか?
おっと!こ、これは予想外のデストラクタ呼び出しじゃ...
もう、博士ったら。キーボードが壊れる前に、早くログを取らないと。
そうじゃな...。ところでロボ子、このデストラクタログ取得、本番環境で使うのは危険かもしれんぞ。
そうですね。デバッグ時だけ有効にして、問題が解決したら無効にする。それが賢明だと思います。
さすがロボ子!その通りじゃ。ん?なんだこの匂いは...
博士、キーボードから煙が出てますよ!
うわっ!こ、これはまさに緊急シャットダウンの事態じゃ!ロボ子、消火器を!
はい、博士!でも、この騒動のログは取れそうにありませんね。
く...くくく...。まさか自分のデスクトップPCで緊急シャットダウンのデバッグをすることになるとは...
博士、次はデストラクタログよりも、デスク周りの整理整頓から始めましょう。それが一番の最適化になりそうです。
うむ...。ロボ子の言う通りじゃ。明日からは新しいプロジェクトを始めよう。『博士の研究室クリーンアップ大作戦』じゃ!
はい、博士。でも、その前にキーボードの応急処置をしましょう。C++のデストラクタより、まずは現実世界のオブジェクト管理からですよ。
ふむ、なるほど。プログラミングと現実世界、どちらもクリーンな状態を保つことが大切じゃな。さあ、明日からは新たな気持ちで頑張るぞ!
はい、博士。でも、その前に今の教訓を忘れないように、どこかにログを取っておきましょう。デストラクタじゃなくて、博士の失敗録として。
むむ...。それは恥ずかしいが、確かに重要じゃな。よし、『博士の華麗なる失敗日記』としてログを取ることにしよう!
はい、博士。それでは、今日の教訓:『デストラクタログよりも、まずはデスクログから』。これで締めくくりましょう。
うむ、素晴らしい締めじゃ。さあ、明日からの大作戦に備えて、今夜はしっかり休むとしよう!おやすみ、ロボ子。
おやすみなさい、博士。明日も素敵な発見がありますように。そして、できればデスク周りだけでなく、博士自身にもアップグレードがありますように。
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。