HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
1116
EFGHデバッガの作成 ContinueDebugEventで引っかかってます7解決


EFGH

リンク

2013/11/16(Sat) 18:04:59|NO.58154

デバッガの作成をしております。

ttp://codezine.jp/article/detail/426
↑こちらのURLを参考にしながら作成を挑んでいますがなかなかうまくいきません。

起動しているプロセスをデバッグしたいのでCreateProcess関数は使わなくてもいいのかな?と考えてます。

①DebugActiveProcessでアクティブなプロセスにアタッチして,デバッグできるようにします。

②ContinueDebugEventでデバッグイベントを報告したスレッドをデバッガが続行できるようにします。


①はできましたが②からがよく分かりません。

pidの取得には先輩方が作成してくださったmemory.dllを使用しております。


#uselib "KERNEL32.DLL" #func DebugActiveProcess "DebugActiveProcess" sptr #func ContinueDebugEvent "ContinueDebugEvent" sptr,sptr,sptr #func WaitForDebugEvent "WaitForDebugEvent" #uselib "memory.dll" #func GetID "GetID" str, var sdim pid GetID "calc.exe", pid pids = int("$" + pid) DebugActiveProcess pids

DebugActiveProcessを使ってしまったら対象プロセスが固まってしまいます。
プロセスを続行できるまでを目指してます。
先輩方ご教授のほうお願いします。



この記事に返信する


EFGH

リンク

2013/11/16(Sat) 18:29:12|NO.58155

こちらのURLも参考になると思います。よろしくお願いします

http://vanillasky-room.cocolog-nifty.com/blog/2009/05/win32-e3b8.html




shiva

リンク

2013/11/17(Sun) 23:36:34|NO.58223

アタッチした後はWaitForDebugEventでデバッグイベントを受けて、必要な処理をした後にContinueDebugEventを呼ぶ、という
デバッガーループを行う必要があります。

イメージとしては次のようになります。


// 必要な#includeや#defineが行われていると仮定 dim de, 24 // struct DEBUG_EVENT DebugActiveProcess pid // アタッチする repeat WaitForDebugEvent varptr(de), INFINITE // デバッグイベントがくるまで待つ // // イベントを処理 // この間対象プロセスは停止している // ContinueDebugEvent de.0, de.1, DBG_CONTINUE // イベントを処理し終えたことを伝える // 対象プロセスは動作を再開する loop



EFGH

リンク

2013/11/18(Mon) 00:19:55|NO.58228

shivaさんソース大変ありがとうございます。

一応自分なりにソース改変させて頂きました。

できあがったものなんですがやはりどこかで失敗してるようです。

デバッギー(calc.exe)が再開されないです。

良ければ汚いソースですがご拝見の程よろしくお願いします


#uselib "kernel32.dll" #func DebugActiveProcess "DebugActiveProcess" int #func ContinueDebugEvent "ContinueDebugEvent" int,int,int #func WaitForDebugEvent "WaitForDebugEvent" int,int #uselib "memory.dll" #func GetID "GetID" str,var // 必要な#includeや#defineが行われていると仮定 #define DBG_CONTINUE $10002 #define INFINITE $FFFFFFF exec "calc.exe" wait 100 sdim pid GetID "calc.exe", pid pids = int("$" + pid) dim de, 24 // struct DEBUG_EVENT DebugActiveProcess pids // アタッチする (ここは成功) repeat : await 0 WaitForDebugEvent varptr(de), INFINITE // デバッグイベントがくるまで待つ (多分ですがここも成功?) // // イベントを処理 // この間対象プロセスは停止している // ContinueDebugEvent de.0, de.1, DBG_CONTINUE // イベントを処理し終えたことを伝える // 対象プロセスは動作を再開する loop



shiva

リンク

2013/11/18(Mon) 00:56:13|NO.58231

>EFGHさん
ごめんなさい、1箇所ミスがありました。

loopの一つ上の行の
> ContinueDebugEvent de.0, de.1, DBG_CONTINUE

> ContinueDebugEvent de.1, de.2, DBG_CONTINUE
に直してください。



EFGH

リンク

2013/11/18(Mon) 21:06:42|NO.58278

お、できましたねー!

見事calc.exeが動きました^^!

ありがとうございます!



EFGH

リンク

2013/11/19(Tue) 01:54:50|NO.58287

解決した後に申し訳ありません。

色々ソース作ってみたんですが

WaitForDebugEventのデバッグイベントを待っている間、他の動作が全く効かなくなりますよね?

WaitForDebugEventで待機待ち↓
ContinueDebugEvent↓デバッグ再開
WaitForDebu・・・で待機待ち

このような感じになって待機待ちの時、別の処理ができなくなります。

何か改善方法なんてありませんか?



shiva

リンク

2013/11/19(Tue) 10:57:54|NO.58289

ヒント:WaitForDebugEventの第2引数

あるいは、監視プロセスとUIプロセスを分離するのも手です。
その方がコードの見通しも良くなるのでお勧めです。
(本当はスレッド分離で充分ですがHSPだとできないので)

もしプロセス間通信の仕方が分からなければ、別途調べてください。
検索すればすぐ見つかります。



ONION software Copyright 1997-2025(c) All rights reserved.