2020年9月22日火曜日

デバッガでのメモリ表示

 
ずっとやり方がわからなかったが出来ないはず無いと思い検索したらわかった
ちょっと使っただけだけど便利すぎる
感動した、さすがはMicroSoftだ!
(当然皮肉です)

問題は自作のeverythingでファイルのクリップへの切り取りを実装したがうまく動かないこと
成功する場合としない場合があって法則性もわからない
VSから起動したら成功するけど単独で起動すると失敗する場合もある

ファイルを切り取る場合はファイル名のデータを作成してクリップに登録するが、その際のデータ仕様としてファイルは複数として、ファイル間は0を一つ、最後のファイルの末尾は0を二つおく
ここがうまくいってないのかと思ったが、このデータはHDROPFILE構造体の後ろに書くので、変数のウインドウを見ても確認できない
で、メモリを直接確認したかった

見たら思った通り、ファイル名の後ろに0は一つだけだった、多分これが理由
たまたま0が続いたときに成功してたんだと思う

GlobalAllocでメモリを確保するときにGMEM_ZEROINITを指定してあるので、大丈夫だと思って明示的にゼロを書き込んでなかった
でもメモリを確認したらcc だった、なぜ??
で、明示的にゼロを書いてやってうまく動作した
めでたしめでたし

ってわけにもいかないので調べたら原因がわかった
GlobalAllocのGMEM_ZEROINITは正しく動作していた
そのあとでmemcpyでそこにファイル名をコピーしたんだけど、memcpyの引数のサイズをファイル名長ではなく確保したメモリサイズにしていたのさ
何となく書き込むのは文字列バッファなので終端の0で書き込み終了してくれるはずだと思っていた
strcpyでもstrcatでもそうなるよね、でもmemcpyは違うって事
調べたらmemcpyのコピー元の型はconst void* だった
とにかくコピー元の先頭アドレスって事ですね
まあそうだよね
こういうことがメモリを見ながらだと良く理解できる
VSいいな

0 件のコメント:

コメントを投稿