1

みんな

C で Windows サービスのスタートアップ コードをデバッグする方法を知りたいのですが、C# ではこのような質問がいくつかありますが、必要なものではありません。これまでのところ、デバッグするプロセスにアタッチすることしかできません。main() 関数をデバッグしたいのですが、どうすればよいですか? 詳細なほど良い。

本当にありがとう。

私のコードは以下のとおりです。

主な機能:

void main()
{   
    SERVICE_TABLE_ENTRY ServiceTable[2];
    ServiceTable[0].lpServiceName = "MemoryStatus";  
    ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain; //ServiceMain
    ServiceTable[1].lpServiceName = NULL;
    ServiceTable[1].lpServiceProc = NULL;

    StartServiceCtrlDispatcher(ServiceTable);
}

ServiceMain 関数:

void ServiceMain(int argc, char** argv)
{        
    //...some codes....

    hStatus = RegisterServiceCtrlHandler("MemoryStatus",(LPHANDLER_FUNCTION)ControlHandler);

    //...some codes....

    //the worker loop of a service
    while(ServiceStatus.dwCurrentState == SERVICE_RUNNING)
    {
        char buffer[10];        
        sprintf(buffer,"login...");
        int result = WriteToLog(buffer);        
        if (result)
        {
             ReportStatus(SERVICE_STOPPED,-1);
             return;
        }
        Sleep(SLEEP_TIME);
    }
    return;
}

および制御ハンドル機能:

void ControlHandler(DWORD request)
{
    switch(request)
    {
    case SERVICE_CONTROL_STOP:
        WriteToLog("Monitoring stopped.");
        //...Report Status to SCM code....
        return;
    case SERVICE_CONTROL_SHUTDOWN:
        WriteToLog("Monitoring stopped.");
        //...Report Status to SCM code....
        return;
    default:
        break;
    }
//...Report Status to SCM code....
    return;
}
4

2 に答える 2

2

Windows サービスを最初からデバッグする方法は 2 つあります。ここでは両方について説明します。

私の好みは、サービスで開始するリモート デバッガー セッションを使用することです ( ntsdWindows Debugging Tool から使用できます)。Windows には、イメージ名 (イメージ ファイル実行オプション) に基づいてプロセスをハイジャックできる特別なメカニズムがあります。以下に、このデバッガーをセットアップする .reg ファイルの内容を示します (デバッグ ツールがインストールされているパスにパスを変更します)。

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\svchost.exe]
"Debugger"="\"C:\\tools\\debugging\\Debugging Tools for Windows (x64)\\ntsd.exe\" -server npipe:pipe=svcpipe -noio"

次のステップは、ユーザーモード デバッガーを使用してこのセッションにアタッチすることです。

windbg -remote "npipe:pipe=svcpipe,server=localhost"

これでデバッグの準備が整いました。マシンを再起動する前に、レジストリ設定を削除することを忘れないでください。そうしないと、Windows が黒い画面でハングします:)

于 2012-10-15T19:23:50.237 に答える
0

OK、2 つの方法があります。まず、コードの先頭でサービス プロセスをスリープ状態にすることができます。このような:

main()
{
    sleep(10);
    .....
}

サービス プロセスにアタッチすると、デバッガーはブレークポイントの位置で停止します。待機時間は 10 秒です。

第二に、コードの先頭で_ASSERT(FALSE)orDebugBreak()関数を使用できます。

于 2013-12-12T02:04:00.670 に答える