アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんにちは。
質問させてください。

先ほど海外の方が制作したC/C++のコードを読んでいたところ

__asm int 3

というコードを見つけました。
少し調べてみたところ0xccというコードを埋め込んでブレイクさせる命令ということはわかりました。

しかし使用用途がいまいちわかりません。

実際には下記のように実装されていました。

#ifdef _DEBUG
#define BreakIf( c )  if( c ){ __asm int 3 }
#else
#define BreakIf( c )
#endif

しかし、いろいろと考えてみたのですがassertとどう使い分ければいいのかよくわかりません。
assertの場合は引数が0の場合引っかかりますが、上記のBreakIfコードは非0の場合に引っかかるよ
うに実装されていました。

この__asm int 3命令は主にどのような場面で使用すべきなのでしょうか?
ご教授のほど、よろしくお願いします。

/*
Microsoft VisualStudio2008 academic edition
Intel Core i7 920 2.66Ghz
RAM:12GB
Windows7 64bit professional
*/

A 回答 (3件)

特に考えることなく assert だけ使えばいいような気がする.


デバッガ使えばなんとかなるのかもしれんが.
    • good
    • 0
この回答へのお礼

ありがとうございます。
やはりassertだけ使っておけば問題ないと思われますよね。

ありがとうございました。

お礼日時:2010/11/30 23:52

int3の挙動が不明ですが、assertだと終了してしまうのに対して強制ブレークがかかるのだとすれば、デバッガでassert発生からトレースしたいときにやや便利かもしれません。



まぁ普段はassert使っておけば問題ないような気はします。
    • good
    • 0

assertはプログラムの挙動が正しくないときに異常を表明するもの。


それに対してint 3(デバッグブレーク命令)は強制的にデバッグブレークするもの。

つまりassertはバグがあるか無いかわかっていないときに、もし異常な状態になったら、それを知らせる。
それに対し、int 3はバグがあることがわかっているが、それがどこか厳密にはわからないとき、その付近を調べるためにデバッガで追えるようにする。
たとえばループの中にバグがいて1000回目にだけ異常になるような場合、ステップ実行で1000回ループをまわすのは無駄なので、ブレーク条件に1000回目のループであることを入れておく。
このような条件ブレークの機能はデバッガにもあるが、条件判定をデバッガ側で行うため、ブレークまで時間がかかることがある。そこでその条件判定を実行側で行うことによりブレークまでの時間を短縮する。
これはデバッグの手法なので、バグを取ったらint 3は削除しておく必要がある。
それに対して、assertはデバッグ後も残しておく。
    • good
    • 0
この回答へのお礼

ありがとうございました!

的確な回答ありがとうございます。
とてもすっきりしました。

ありがとうございました!

お礼日時:2010/12/01 22:14

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!