-
Notifications
You must be signed in to change notification settings - Fork 163
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
デバッグにVC++のCランタイム機能を活用する #1051
Merged
berryzplus
merged 8 commits into
sakura-editor:master
from
berryzplus:feature/fix_leakcheck
Sep 22, 2019
Merged
デバッグにVC++のCランタイム機能を活用する #1051
berryzplus
merged 8 commits into
sakura-editor:master
from
berryzplus:feature/fix_leakcheck
Sep 22, 2019
Conversation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
new⇒DEBUG_NEWの読替マクロがビルドエラーになっているのを対処する。 同時に、デバッグ時にはUSE_LEAK_CHECK_WITH_CRTDBGが有効になるようにする。
コンストラクタなしの構造体、普通のクラス、配列データの3パターンで確認。
・参照ドキュメントがDeadLinkになっていたので有効なアドレスに差し替える。 ・リークチェックの方法を差替後ドキュメントのやり方に合わせる。
ドキュメントの説明通り、DBG_NEWを使って検証する方式に変更。
デバッグ用に「メモリをわざと汚す」ためのoperatorを再定義する。 ファイル名と呼出元行番号を受け入れるデバッグ用バージョンを上書きする。 これは、MSVCRTDの機能なのでMSVCのデバッグ版でのみ有効になるように判定を変更する。 実質的に何もしてなかったoperator deleteのカスタム実装は削除する。
This reverts commit 19984f4920f0337c393c66d45eea91ee5e8eb902.
This reverts commit 0f1fa70028d9d49cac8f96b65b66ffe7538a2bff.
✅ Build sakura 1.0.2261 completed (commit 344f896672 by @berryzplus) |
beru
approved these changes
Sep 22, 2019
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
問題無いと思います。
テスト用に追加したメモリリークしているメモリ確保の位置がプログラム終了時に出力される事を確認しました。
レビューありがとうございます。 |
HoppingTappy
pushed a commit
to HoppingTappy/sakura
that referenced
this pull request
Jun 16, 2020
…kcheck デバッグにVC++のCランタイム機能を活用する
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
PR の目的
デバッグにVC++のCランタイム機能を活用することにより、
ビルドの問題を解消すると共にデバッグ実装をシンプルにします。
カテゴリ
PR の背景
言葉で全貌を説明すると少しややこしいので、やってることを書きます。
#1045 のUSE_LEAK_CHECK_WITH_CRTDBGがビルドエラーになる件の対策PRとして作り始めました。
#1045 の解消方法自体は単純でした。( 293493c )
#1045 (comment) で書いている通り、ビルドエラーの原因はこの部分です。
sakura/sakura_core/config/build_config.h
Lines 98 to 100 in 8b1f784
ここで new ⇒ DEBUG_NEW とマクロ定義しているのを解除すれば、ビルドは通るようになります。
メモリリークを検出することだけを目的とするなら、この対応で十分です。
「十分です。」といっても、メモリリークチェックがどう動くものか知らん人が大半だと思います。
そこで、せっかくなので実際にメモリリークするコードを書いて、メモリリークチェックが正しく機能しているかどうか検証してみました。( 9ac48d7 )
この修正によるメモリリークの検出結果はこんな感じになりました。
この出力内容ではソースコードのどこに問題があるかわかりませんが、ちゃんと検出できてますね 😄
ソースコードの行番号が出てない理由は、
DEBUG_NEW
マクロを使ってないからなんですが、とりあえず、 マクロを使わなくてもメモリリークの検出自体はできる の検証材料にはなると思います。ソースコード中の参考リンクがDeadLinkになってることから想像するに、
修正前のメモリリークの検出方式はだいぶ古い情報に基づくものです。
sakura/sakura_core/config/build_config.h
Lines 89 to 92 in 7471046
せっかくの機会なので、最新のドキュメントに基づいた検出方式にアップデートしてみました。( 6adb54d )
この修正によるメモリリークの検出結果はこんな感じになりました。
デバッグ用マクロの名前が DEBUG_NEW ⇒ DBG_NEW になりました。
まだ DBG_NEW を使っていませんが、メモリ確保を行った行番号が出力されるようになっています。
これが最新の方法 _CRTDBG_MAP_ALLOC を使うメリットです。
ただ、この行番号って、mallocを記述した行番号だからあんまし意味ないですよね 😢
普通に考えて、せっかく行番号を出すなら正しい行番号が出てくれたほうがよいです。
検証コードの new を DBG_NEW に書き換えて、正しい行番号を出力できるかチェックしてみました。( c9dbcc7 )
この修正によるメモリリークの検出結果はこんな感じになりました。
デバッグ用マクロ DBG_NEW を使ったことにより、実際にメモリ確保を行った検証コードの行番号が出力されるようになっています。
ただ、これも「問題アリ」です。
ダンプデータの内容が CDCDCDCD になっています。
@kobake さん 肝煎り の
n_e_w_!n_e_w_!n_e_w_!
の仕様が吹っ飛んでいます。メモリを汚せなくなった原因は、カスタムnewの実装がMSVCのデバッグ版newと異なっているからです。単純にシグニチャを合わせることで、この問題を解決できます。個人的には
n_e_w_!n_e_w_!n_e_w_!
の仕様の必要性には疑問を持っているんですが、対処を入れてみました。( 24641ef )この修正によるメモリリークの検出結果はこんな感じになりました。
ここまでで当初の目的は果たせたと思っています。
あとのコミットは、リテラル文字列関連の微修正と検証コードの除去をしているだけです。
PR のメリット
PR のデメリット (トレードオフとかあれば)
PR の影響範囲
関連チケット
close #1046 DEBUGのUSE_LEAK_CHECK_WITH_CRTDBGを有効にしたい
#1045 DEBUGのUSE_LEAK_CHECK_WITH_CRTDBGを有効にするとコンパイルエラー
#381 new/deleteのオーバーロードがGCCに怒られる対応
#51 ビルド時警告の削減:operator new/delete 部分
#48 ビルド時警告の削減
#36 プロジェクトファイルをsakura配下に集めませんか?の実装案
参考資料
https://docs.microsoft.com/en-us/visualstudio/debugger/finding-memory-leaks-using-the-crt-library