プログラマ向けのアプリケヌション怜蚌ツヌルWindowsアプリケヌションのテスト

おそらく、プロゞェクトはメモリを操䜜する際の䟋倖を回避するためにtry { /* code */ } catch (...) { }を䜜成せず、ハンドルを閉じおWindows Vista仮想化に぀いお知るこずができ、プログラムはクラッシュしたせんたれに繰り返される理由。

その埌、運が良ければ、次のトピックに進むこずができたす。

しかし、時々、奇劙なこずが起こりそうです。 プログラムは突然「クラッシュ」し、メモリがどこかでリヌクし、サヌバヌで実行されおいるプログラムの奇劙な動䜜に぀いお䞍平を蚀っおもう䞀床電話をかけたしたが、もちろんあなたは問題を「ラップ」しお、ハヌドりェアに䟝存しおいるず確信しおいたすそしお倧䞈倫。 それでも、Windows甚のプログラムの開発はしばしばトリッキヌであり、䞍泚意たたはアヌキテクチャの無知による゚ラヌから誰も安党ではありたせん。 私はこれらの間違いを避ける方法を孊びたせん-私は自分自身を知りたせん。 しかし、ここで効果的なデバッグのための1぀のツヌルをアドバむスできたす。

これは、Microsoft Application Verifierに぀いおのものです。 しかし、これはデバッガヌではありたせん。 それどころか、デバッガヌがなければ、それ自䜓は比范的圹に立たない。 しかし、それず組み合わせお、倚くの重芁なプラットフォヌム固有の問題を怜出できたす。 さらに、AppVerifierを䜿甚したテストに合栌しない限り、「Windows 7ず互換性がありたせん」蚌明曞を取埗するこずはできたせん実際には「Vista Certified」でも同様ですが、明らかにこれは受け入れられたせん。 そしお、この蚌明曞は、ナヌザヌに察しお、それを受け取ったプログラムがより良くならないかもしれないこずを保蚌したすが、少なくずもそれは傷぀けたせん 。 さお、「氎」は終わりたした。仕事に取り掛かりたしょう。

申し蟌み方法


Habrocheloveka甹AppVerifierをダりンロヌドしおむンストヌルしおください。耇雑ではありたせん。 グラフィカルシェルを実行しおみたしょう実際の管理者の䞋から、Vistaの䞋で、それは別の方法では機胜したせん。



巊偎には、テスト甚のアプリケヌションのリストがありたす。 右偎には、遞択したアプリケヌションをチェックするセクションのリストがありたす。 MSDNは、AppVerifierはC ++プログラムをテストするように蚭蚈されおいるが、䞀般にネむティブコヌドに適甚可胜であるず䞻匵しおいたす。

グラフィカルシェルはテストを生成せず、目的の項目を遞択するこずのみを可胜にしたす。 チェック自䜓は、いわゆる「レむダヌ」、動的に接続されたラむブラリvfbasics, vfcompat, vfLuaPriv, vfprintおかげで実装されたす system32それらを鑑賞できsystem32 。 テスト察象のアプリケヌションが起動するず、アプリケヌションに接続し、 HeapAlloc, GetTickCount, CloseHandleなどのシステム関数の呌び出しをむンタヌセプトしたす。 むンタヌセプタヌはいく぀かの远加チェックを実行し、元の関数を呌び出したす。したがっお、 以䞋で怜蚎するいく぀かのケヌスを陀き 、これはテスト察象のアプリケヌションの動䜜に圱響したせん。 パフォヌマンスの䜎䞋が顕著でない限り。 䞻芳的に、最悪の堎合、プログラムは5回「スロヌダりン」したす。特定の数倀が必芁かどうかは、あなたに任せたす。

ここには重芁な機胜がありたす テスト䞭のアプリケヌションのファむルを远加するずきに遞択するずいう事実にもかかわらず、チェックはパスなしでその名前にのみ添付されたす 。 プロゞェクトを収集する構成およびフォルダヌを心配する必芁はありたせん通垞、デバッグずリリヌスのフォルダヌは異なりたすが、むンストヌルされたチェックを忘れるこずができたす。たた、デスクトップからプログラムを起動するず、動䜜しおいたせん。」

テスト項目の意味に぀いおは埌ほど説明したすが、次に、たずえばnotepad.exeを远加しお、すべおのDawをむンストヌルしたす。 ノヌトブックを実行し、数行を远加しお、保存しおみおください。 O-pa、倱敗



状況の唯䞀の結果ではなく、別の譊告りィンドりが衚瀺されるか、たったく衚瀺されない堎合がありたす。 どうしたの AppVerifierグラフィックアドむンをもう䞀床芋おみたしょう。 今回は、メむンメニュヌから[ログ]項目を遞択したす。テストされたアプリケヌションに関連付けられたログファむルのリストを参照しおください。 起動ログによる。



物理的に、これらのログファむルはナヌザヌプロファむルのルヌトにあるAppVerifierLogsフォルダヌにありたす。 玠手バむナリ圢匏でそれらを読むのは難しいので、察応するログの[衚瀺]ボタンを抌したす。 それをxmlにダンプし、xmlのデフォルトビュヌアヌを開きたす。



泚意深く芋た人のためにこのスクリヌンショットに衚瀺される゚ラヌは、前のスクリヌンショットの゚ラヌメッセヌゞプログラムの通垞の動䜜に察応しおいたせんが、少し遅れお発生したす。

問題の簡単な説明ずスタックトレヌスを次に瀺したす。 そしお、私からは、譊告ではなく゚ラヌを探す方法のヒントがありたす。 ちなみに、゚ラヌが存圚する堎合、プログラムはVista / Win7ずの互換性の認定を受けたせん。 埅っおください、でもこれはノヌトですか たあ、はい、唯䞀のシッ。

患者の治療


デバッガヌを実行したす。 スタゞオに組み蟌たれたデバッガヌ、たたはDebugging Tools for Windowsの無料のWinDbgずしたす確かにもっず掗緎されおいたすが、今では重芁ではありたせん。

そしお、ここに私たちの患者がいたす
int _tmain( int argc, _TCHAR* argv[])
{
int *p = new int ();
delete p;
*p = 0; // p = 0 will be OK, but *p = 0 is error!
}

このフラグメントの朜圚的な危険性は、 deleteずメモリの䞊曞きを䌎う行が時間ずずもに匕き䌞ばされたかどうかを簡単に評䟡できたす。 ただし、リリヌスでもリリヌスアセンブリでも、このような問題は怜出されたせんVisual Studio、既定の構成。

ここで、Application VerifierのBasicsグルヌプをテストするためのプログラムを远加したす。 そしお、デバッガヌの䞋でたずえば、F5のスタゞオから実行したす。 AppVerifierはスタゞオの声で私たちに話したした



たた、デバッグ出力には、察応する構造的な䟋倖が衚瀺されたす。
=======================================
VERIFIER STOP 00000013: pid 0xB54: First chance access violation for current stack trace.

02B59FF8 : Invalid address causing the exception.
0082142F : Code address executing the invalid access.
0013F670 : Exception record.
0013F68C : Context record.

=======================================

䟋倖が䜕であるか00000013、どのメモリアドレス02B59FF8、どのコヌドアドレス0082142Fで発生したかがわかりたす。 Windowsデバッグシンボルをダりンロヌドした幞運な人は、問題が発生した゜ヌスコヌド内の堎所ず䟋倖に぀ながったスタックトレヌスも衚瀺されたす。

さお、私たちはこの問題を発芋したした。぀たり、修正したずいうこずです。 他の゚ラヌクラスの堎合、操䜜アルゎリズムは保持されたすが、修正手順はそれほど簡単ではない堎合がありたす。

怜出可胜な問題


ここで、AppVerifierがどの問題を識別できるのかを考えおみたしょう。 すべおのテストオプションはグルヌプに分けられたす。 䜎リ゜ヌスシミュレヌショングルヌプずTimeRollOverおよびHighVersionLieテストを陀き、チェックはアプリケヌションの動䜜を倉曎したせん゚ラヌが怜出されない堎合。

1.歪みのチェック

1.1。 䜎リ゜ヌスシミュレヌション

ここがノヌトブックの萜䞋の理由です。 このグルヌプのテストでは、リ゜ヌス䞍足のシステムの動䜜をシミュレヌトできたす。 アプリケヌションは、メモリ割り圓お、ファむル䜜成、むベント、りィンドり、およびレゞストリ゚ントリを簡単に拒吊できたす乱数センサヌを䜿甚。 通垞、玄2〜5秒の「穏やかな」時間があり、アプリケヌションがリ゜ヌスを完党に䜿甚できるようになりたす。 これは、アプリケヌションが起動できるようにするために行われたす以前に発明されたもので、以前は悲しいものでした。 プログラムの通垞の動䜜は安定性です。 譊告ダむアログを衚瀺したすが、「クラッシュ」は衚瀺したせん。 そのため、コヌドではこれらの状況を提䟛する必芁がありたす。

1.2。 グルヌプMiscのTimeRollOver

action数回実行する1秒以内のコヌド䟋を考えおみたしょう。
DWORD time_end = GetTickCount() + 1000; // 1s timelimit
do { action(); } while (GetTickCount() < time_end);

キャッチは肉県で芋るこずができたす。 time_end非垞に近いが、 DWORD_MAX-1000未満であり、 action() 1秒以䞊かかる堎合がある堎合、サむクルは垌望より少し長くなりたす。 ぀たり、50日間DWORD_MAX /1000 * 60 * 24。

そしお、これはあなたが次のフラグメントに぀いお蚀う唯䞀のケヌスではありたせんか
char buf[8];
sprintf(buf, "%i" , GetTickCount());

このような問題を蚺断するには、TimeRollOverをチェックするず、GetTickCount関数の倀がより速く「実行」されたす。 れロ調敎の前の完党なサむクルには5分かかりたす。

1.3。 互換性グルヌプのHighVersionLie

突然GetVersionEx関数を䜿甚する堎合、このテストは、有効なOSバヌゞョンの怜蚌が正しくないコヌドブランチの怜出に圹立ちたす。

OSVERSIONINFO osvi;
ZeroMemory(&osvi, sizeof (OSVERSIONINFO));
osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
GetVersionEx(&osvi);

BOOL bIsWindowsXP_or_Later = (osvi.dwMajorVersion >= 5) && (osvi.dwMinorVersion >= 1);
if (!bIsWindowsXP_or_Later)
printf( "Windows XP or later required.\n" );


この箇所には明らかな間違いがありたす。 Windows 20005.0を遮断するために、マむナヌバヌゞョンXP5.1に远加のチェックが導入されたしたが、コヌドはWindows Vista6.0も砎棄したす。 Windows 76.1では動䜜したす。 これが本圓にWindows Vistaずの互換性が䜎い理由ですか Microsoftは、この問題を含め、Vistaプログラムずの互換性のない70が機胜しないず䞻匵しおいたす 。

しかし、開発者のコ​​ンピュヌタヌでこの状況を蚺断するこずは困難です。圌は、OSの1぀の修正バヌゞョンを持っおいたす。 OSの異なるバヌゞョンで仮想マシンを䜿甚するこずも、DAWのHighVersionLieを䜿甚するこずもできたす。 次に、 GetVersionExの倀が倉曎されたす通垞、ルヌルdwMajorVersion += 3; dwMinorVersion = 0 。

2.倉曎しないチェック

2.1。 基本グルヌプのメモリ

HeapAlloc, GlobalAllocおよびその他のWindowsヒヌプマネヌゞャヌAPIぞの呌び出しを怜蚌したす。 圌はメモリリヌクを監芖しおいたせんが、これは他の方法で解決できたす 。

2.2。 基本グルヌプのTLS

スレッドロヌカルストレヌゞAPIぞの呌び出しの正確さを監芖したす。

2.3。 基本グルヌプの䟋倖

䟋倖をキャッチするこずの適切性を監芖したす。特に、アクセス違反䟋倖、 try { } catch (...) { }などのスタブ内の䟋倖を「マスク解陀」しようずする詊みを監芖したす。

2.4。 Basicsグルヌプのハンドル

ハンドルに察する操䜜の蚱容性、ハンドルの正確性、およびその寿呜を監芖したす。 もう少し英語で 。

2.5。 [基本]グルヌプのロック

クリティカルセクションの正しい䜿甚をチェックし、クリティカルセクション蚭定に関連する別のストリヌムからのクリティカルセクションのドロップを蚱可したせん。

2.6。 バンドMiscのDirtyStacks

スタックの未䜿甚郚分を0xCDパタヌンで定期的に埋めたす。これにより、初期化されおいない倉数たたは関数パラメヌタヌを怜出できたす。

2.7。 MiscグルヌプのDangerousAPI

TerminateThreadような望たしくない、朜圚的に危険なAPI関数の䜿甚に぀いお通知したす。

2.8。 ルアプリフ

限定ナヌザヌアカりント特暩テスト。 プログラムに管理者特暩が必芁かどうかを確認し、プログラムは実際の管理者だけに有効なアクションを実行したす。

予枬管理者のみが実行できるすべおのプログラムアクションを䞀芧衚瀺するず蚺断 ACCESS_DENIED゚ラヌで管理アクションでプログラムを拒吊するの2぀の郚分で構成されたす。 したがっお、プログラマはゲストずしおログむンしおプログラムを個別にテストする必芁はありたせん。 たた、Windows Vista以降での仮想化に関連する倚くの機胜もチェックしたす。

おわりに


AppVerifierは、倚くの「フロヌティング」および「隠された」および堎合によっおは特別に隠された問題を特定しお解決できる興味深いツヌルです。 党䜓ずしお䜿甚するこずは難しくありたせん。特定のスキルがあるず䟿利です。 たた、「Windows互換」の蚌明曞を受け取りたい堎合、それを知っおいるこずは避けられたせん。 私はすでに2぀のプロゞェクトを手䌝いたしたが、あなたにずっおも圹に立぀こずを願っおいたす。

*すべおの゜ヌスコヌドは、 ゜ヌスコヌドハむラむタヌで匷調衚瀺されたした。

Source: https://habr.com/ru/post/J82878/


All Articles