Author: ggregory
Date: Sat Jul  8 01:49:43 2017
New Revision: 1801253

URL: http://svn.apache.org/viewvc?rev=1801253&view=rev
Log:
[DAEMON-368] Add DEBUG and ERROR logging to help diagnose problems when 
starting a Windows Service.

Modified:
    commons/proper/daemon/trunk/src/changes/changes.xml
    commons/proper/daemon/trunk/src/native/windows/apps/prunsrv/prunsrv.c
    commons/proper/daemon/trunk/src/native/windows/src/javajni.c
    commons/proper/daemon/trunk/src/native/windows/src/rprocess.c
    commons/proper/daemon/trunk/src/native/windows/src/service.c

Modified: commons/proper/daemon/trunk/src/changes/changes.xml
URL: 
http://svn.apache.org/viewvc/commons/proper/daemon/trunk/src/changes/changes.xml?rev=1801253&r1=1801252&r2=1801253&view=diff
==============================================================================
--- commons/proper/daemon/trunk/src/changes/changes.xml (original)
+++ commons/proper/daemon/trunk/src/changes/changes.xml Sat Jul  8 01:49:43 2017
@@ -39,6 +39,9 @@
   </properties>
   <body>
     <release version="1.1.0" date="2017-MM-DD" description="Feature and bug 
fix release">
+      <action issue="DAEMON-368" type="update" dev="ggregory" type="add">
+        Add DEBUG and ERROR logging to help diagnose problems when starting a 
Windows Service.
+      </action>
       <action type="update" dev="markt">
         Increase minimum Java version to Java 5.
       </action>

Modified: commons/proper/daemon/trunk/src/native/windows/apps/prunsrv/prunsrv.c
URL: 
http://svn.apache.org/viewvc/commons/proper/daemon/trunk/src/native/windows/apps/prunsrv/prunsrv.c?rev=1801253&r1=1801252&r2=1801253&view=diff
==============================================================================
--- commons/proper/daemon/trunk/src/native/windows/apps/prunsrv/prunsrv.c 
(original)
+++ commons/proper/daemon/trunk/src/native/windows/apps/prunsrv/prunsrv.c Sat 
Jul  8 01:49:43 2017
@@ -740,18 +740,18 @@ static BOOL docmdStartService(LPAPXCMDLI
                                NULL,
                                NULL);
         if (rv)
-            apxLogWrite(APXLOG_MARK_INFO "Service '%S' started",
+            apxLogWrite(APXLOG_MARK_INFO "Started service '%S'",
                         lpCmdline->szApplication);
         else
-            apxLogWrite(APXLOG_MARK_ERROR "Failed to start '%S' service",
+            apxLogWrite(APXLOG_MARK_ERROR "Failed to start service '%S'",
                         lpCmdline->szApplication);
 
     }
     else
-        apxDisplayError(FALSE, NULL, 0, "Unable to open '%S' service",
+        apxDisplayError(FALSE, NULL, 0, "Unable to open service '%S'",
                         lpCmdline->szApplication);
     apxCloseHandle(hService);
-    apxLogWrite(APXLOG_MARK_INFO "Start service finished.");
+    apxLogWrite(APXLOG_MARK_INFO "Start service finished, returning %d", rv);
     return rv;
 }
 
@@ -841,7 +841,7 @@ static BOOL reportServiceStatusE(DWORD d
    static DWORD dwCheckPoint = 1;
    BOOL fResult = TRUE;
 
-   apxLogWrite(APXLOG_MARK_DEBUG "reportServiceStatusE: %d, %d, %d, %d",
+   apxLogWrite(APXLOG_MARK_DEBUG "reportServiceStatusE: dwCurrentState = %d, 
dwWin32ExitCode = %d, dwWaitHint = %d, dwServiceSpecificExitCode = %d",
                dwCurrentState, dwWin32ExitCode, dwWaitHint, 
dwServiceSpecificExitCode);
 
    if (_service_mode && _service_status_handle) {
@@ -977,19 +977,19 @@ static DWORD WINAPI serviceStop(LPVOID l
         /* Create shutdown event */
         gShutdownEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
         if (!apxJavaStart(&gSargs)) {
-            apxLogWrite(APXLOG_MARK_ERROR "Failed starting java");
+            apxLogWrite(APXLOG_MARK_ERROR "Failed starting Java");
             rv = 3;
         }
         else {
             if (lstrcmpA(_jni_sclass, "java/lang/System") == 0) {
                 reportServiceStatus(SERVICE_STOP_PENDING, NO_ERROR, 20 * 1000);
-                apxLogWrite(APXLOG_MARK_DEBUG "Forcing java jni System.exit 
worker to finish...");
+                apxLogWrite(APXLOG_MARK_DEBUG "Forcing java JNI System.exit 
worker to finish...");
                 return 0;
             }
             else {
-                apxLogWrite(APXLOG_MARK_DEBUG "Waiting for java jni stop 
worker to finish...");
+                apxLogWrite(APXLOG_MARK_DEBUG "Waiting for java JNI stop 
worker to finish...");
                 apxJavaWait(hWorker, INFINITE, FALSE);
-                apxLogWrite(APXLOG_MARK_DEBUG "Java jni stop worker 
finished.");
+                apxLogWrite(APXLOG_MARK_DEBUG "Java JNI stop worker 
finished.");
             }
         }
         wait_to_die = TRUE;

Modified: commons/proper/daemon/trunk/src/native/windows/src/javajni.c
URL: 
http://svn.apache.org/viewvc/commons/proper/daemon/trunk/src/native/windows/src/javajni.c?rev=1801253&r1=1801252&r2=1801253&view=diff
==============================================================================
--- commons/proper/daemon/trunk/src/native/windows/src/javajni.c (original)
+++ commons/proper/daemon/trunk/src/native/windows/src/javajni.c Sat Jul  8 
01:49:43 2017
@@ -961,7 +961,7 @@ static DWORD WINAPI __apxJavaWorkerThrea
 finished:
     if (lpJava) {
         lpJava->dwWorkerStatus = 0;
-        apxLogWrite(APXLOG_MARK_DEBUG "Java Worker thread finished %s:%s with 
status=%d",
+        apxLogWrite(APXLOG_MARK_DEBUG "Java Worker thread finished %s:%s with 
status = %d",
                     lpJava->clWorker.sClazz, lpJava->clWorker.sMethod, rv);
         SetEvent(lpJava->hWorkerInit);
     }

Modified: commons/proper/daemon/trunk/src/native/windows/src/rprocess.c
URL: 
http://svn.apache.org/viewvc/commons/proper/daemon/trunk/src/native/windows/src/rprocess.c?rev=1801253&r1=1801252&r2=1801253&view=diff
==============================================================================
--- commons/proper/daemon/trunk/src/native/windows/src/rprocess.c (original)
+++ commons/proper/daemon/trunk/src/native/windows/src/rprocess.c Sat Jul  8 
01:49:43 2017
@@ -262,7 +262,9 @@ static DWORD __apxProcessWrite(LPAPXPROC
 /** Helper functions */
 static BOOL __apxProcCreateChildPipes(LPAPXPROCESS lpProc)
 {
-    BOOL   rv = FALSE;
+       apxLogWrite(APXLOG_MARK_DEBUG "Commons Daemon procrun 
__apxProcCreateChildPipes()");
+
+       BOOL   rv = FALSE;
 
     if (!CreatePipe(&(lpProc->hChildStdInp),
                     &(lpProc->hChildInpWr),
@@ -568,19 +570,24 @@ apxProcessExecute(APXHANDLE hProcess)
     DWORD id;
     BOOL  bS = FALSE;
 
-    if (hProcess->dwType != APXHANDLE_TYPE_PROCESS)
-        return FALSE;
+       apxLogWrite(APXLOG_MARK_DEBUG "Apache Commons Daemon 
apxProcessExecute()");
+       if (hProcess->dwType != APXHANDLE_TYPE_PROCESS) {
+
+               return FALSE;
+       }
 
     lpProc = APXHANDLE_DATA(hProcess);
     /* don't allow multiple execute calls on the same object */
-    if (lpProc->dwChildStatus & PROC_INITIALIZED)
-        return FALSE;
+       if (lpProc->dwChildStatus & PROC_INITIALIZED) {
+               return FALSE;
+       }
     lpProc->bSaveHandles = TRUE;
     SAVE_STD_HANDLES(lpProc);
     if (!__apxProcCreateChildPipes(lpProc))
         goto cleanup;
     REDIRECT_STD_HANDLES(lpProc);
-    AplZeroMemory(&si, sizeof(STARTUPINFO));
+       apxLogWrite(APXLOG_MARK_DEBUG "Apache Commons Daemon AplZeroMemory()");
+       AplZeroMemory(&si, sizeof(STARTUPINFO));
 
     si.cb = sizeof(STARTUPINFO);
     si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
@@ -590,13 +597,17 @@ apxProcessExecute(APXHANDLE hProcess)
     si.hStdError  = lpProc->hChildStdErr;
     si.hStdInput  = lpProc->hChildStdInp;
 
-    if (lpProc->lpEnvironment)
-        FreeEnvironmentStringsW(lpProc->lpEnvironment);
-    lpProc->lpEnvironment = GetEnvironmentStringsW();
+       if (lpProc->lpEnvironment) {
+               apxLogWrite(APXLOG_MARK_DEBUG "Apache Commons Daemon 
FreeEnvironmentStringsW()");
+               FreeEnvironmentStringsW(lpProc->lpEnvironment);
+       }
+       apxLogWrite(APXLOG_MARK_DEBUG "Apache Commons Daemon 
GetEnvironmentStringsW()");
+       lpProc->lpEnvironment = GetEnvironmentStringsW();
 
     if (!IS_INVALID_HANDLE(lpProc->hUserToken)) {
         si.lpDesktop = _desktop_name;
-        bS = CreateProcessAsUserW(lpProc->hUserToken,
+               apxLogWrite(APXLOG_MARK_DEBUG "Apache Commons Daemon 
CreateProcessAsUserW()");
+               bS = CreateProcessAsUserW(lpProc->hUserToken,
                                   lpProc->szApplicationExec,
                                   lpProc->szCommandLine,
                                   lpProc->lpSA,
@@ -612,7 +623,8 @@ apxProcessExecute(APXHANDLE hProcess)
         OutputDebugStringW(lpProc->szApplicationExec);
         OutputDebugStringW(lpProc->szCommandLine);
 
-        bS = CreateProcessW(lpProc->szApplicationExec,
+               apxLogWrite(APXLOG_MARK_DEBUG "Apache Commons Daemon 
CreateProcessW()");
+               bS = CreateProcessW(lpProc->szApplicationExec,
                             lpProc->szCommandLine,
                             lpProc->lpSA,
                             NULL,
@@ -627,29 +639,36 @@ apxProcessExecute(APXHANDLE hProcess)
     SAFE_CLOSE_HANDLE(lpProc->hChildStdInp);
     SAFE_CLOSE_HANDLE(lpProc->hChildStdOut);
     SAFE_CLOSE_HANDLE(lpProc->hChildStdErr);
-    if (!bS)
-        goto cleanup;
+       if (!bS) {
+               goto cleanup;
+       }
     /* Set the running flag */
     lpProc->dwChildStatus |= (CHILD_RUNNING | PROC_INITIALIZED);
 
-    lpProc->hWorkerThreads[0] = CreateThread(NULL, 0, __apxProcStdoutThread,
+       apxLogWrite(APXLOG_MARK_DEBUG "Apache Commons Daemon CreateThread()");
+       lpProc->hWorkerThreads[0] = CreateThread(NULL, 0, __apxProcStdoutThread,
                                              hProcess, 0, &id);
-    lpProc->hWorkerThreads[1] = CreateThread(NULL, 0, __apxProcStderrThread,
+       apxLogWrite(APXLOG_MARK_DEBUG "Apache Commons Daemon CreateThread()");
+       lpProc->hWorkerThreads[1] = CreateThread(NULL, 0, __apxProcStderrThread,
                                              hProcess, 0, &id);
-    ResumeThread(lpProc->stProcInfo.hThread);
-    lpProc->hWorkerThreads[2] = CreateThread(NULL, 0, __apxProcWorkerThread,
+       apxLogWrite(APXLOG_MARK_DEBUG "Apache Commons Daemon ResumeThread()");
+       ResumeThread(lpProc->stProcInfo.hThread);
+       apxLogWrite(APXLOG_MARK_DEBUG "Apache Commons Daemon CreateThread()");
+       lpProc->hWorkerThreads[2] = CreateThread(NULL, 0, __apxProcWorkerThread,
                                             hProcess, 0, &id);
 
     SAFE_CLOSE_HANDLE(lpProc->stProcInfo.hThread);
     /* Close child handles first */
-    return TRUE;
+       apxLogWrite(APXLOG_MARK_DEBUG "Apache Commons Daemon 
apxProcessExecute() returning TRUE");
+       return TRUE;
 cleanup:
-    /* Close parent side of the pipes */
+       /* Close parent side of the pipes */
     SAFE_CLOSE_HANDLE(lpProc->hChildInpWr);
     SAFE_CLOSE_HANDLE(lpProc->hChildOutRd);
     SAFE_CLOSE_HANDLE(lpProc->hChildErrRd);
 
-    return FALSE;
+       apxLogWrite(APXLOG_MARK_DEBUG "Apache Commons Daemon 
apxProcessExecute() returning FALSE");
+       return FALSE;
 }
 
 BOOL

Modified: commons/proper/daemon/trunk/src/native/windows/src/service.c
URL: 
http://svn.apache.org/viewvc/commons/proper/daemon/trunk/src/native/windows/src/service.c?rev=1801253&r1=1801252&r2=1801253&view=diff
==============================================================================
--- commons/proper/daemon/trunk/src/native/windows/src/service.c (original)
+++ commons/proper/daemon/trunk/src/native/windows/src/service.c Sat Jul  8 
01:49:43 2017
@@ -378,11 +378,15 @@ apxServiceControl(APXHANDLE hService, DW
 
     lpService = APXHANDLE_DATA(hService);
     /* Manager mode cannot handle services */
-    if (lpService->bManagerMode)
-        return FALSE;
+       if (lpService->bManagerMode) {
+               apxLogWrite(APXLOG_MARK_ERROR "apxServiceControl(): Manager 
mode cannot handle services, returning FALSE");
+               return FALSE;
+       }
     /* Check if the ServiceOpen has been called */
-    if (IS_INVALID_HANDLE(lpService->hService))
-        return FALSE;
+       if (IS_INVALID_HANDLE(lpService->hService)) {
+               apxLogWrite(APXLOG_MARK_ERROR "apxServiceControl(): Service is 
not open, returning FALSE");
+               return FALSE;
+       }
     switch (dwControl) {
         case SERVICE_CONTROL_CONTINUE:
             dwPending = SERVICE_START_PENDING;
@@ -425,11 +429,17 @@ apxServiceControl(APXHANDLE hService, DW
                 break;
         }
     }
-    if (!dwPending && !dwState)
-        return FALSE;
+       if (!dwPending && !dwState) {
+               apxLogWrite(APXLOG_MARK_ERROR
+                       "apxServiceControl():  !dwPending(%d) && !dwState(%d); 
returning FALSE",
+                       dwPending,
+                       dwState);
+               return FALSE;
+       }
     /* Now lets control */
     if (!QueryServiceStatus(lpService->hService, &stStatus)) {
-        apxLogWrite(APXLOG_MARK_SYSERR);
+               apxLogWrite(APXLOG_MARK_ERROR "apxServiceControl(): 
QueryServiceStatus failure, returning FALSE");
+               apxLogWrite(APXLOG_MARK_SYSERR);
         return FALSE;
     }
     /* signal that we are about to control the service */
@@ -493,18 +503,36 @@ apxServiceControl(APXHANDLE hService, DW
     if (fnControlCallback)
         (*fnControlCallback)(lpCbData, uMsg, (WPARAM)3, (LPARAM)0);
     /* Check if we are in the desired state */
-    Sleep(1000);
+       DWORD sleepMillis = 1000;
+       apxLogWrite(APXLOG_MARK_DEBUG "apxServiceControl(): Sleeping %d 
milliseconds", sleepMillis);
+    Sleep(sleepMillis);
 
     if (QueryServiceStatus(lpService->hService, &stStatus)) {
-        if (fnControlCallback)
-            (*fnControlCallback)(lpCbData, uMsg, (WPARAM)4,
-                                 (LPARAM)&stStatus);
-        if (stStatus.dwCurrentState == dwState)
-            return TRUE;
-
-    }
+               apxLogWrite(APXLOG_MARK_DEBUG "apxServiceControl(): 
QueryServiceStatus OK");
+               if (fnControlCallback) {
+                       apxLogWrite(APXLOG_MARK_DEBUG "apxServiceControl(): 
Calling fnControlCallback()");
+                       (*fnControlCallback)(lpCbData, uMsg, (WPARAM)4, 
(LPARAM)&stStatus);
+                       apxLogWrite(APXLOG_MARK_DEBUG "apxServiceControl(): 
Returned from fnControlCallback()");
+               }
+               if (stStatus.dwCurrentState == dwState) {
+                       return TRUE;
+               } else {
+                       apxLogWrite(APXLOG_MARK_ERROR 
+                               "apxServiceControl(): dwState(%d) != 
dwCurrentState(%d); "
+                               "dwWin32ExitCode = %d, dwWaitHint = %d, 
dwServiceSpecificExitCode = %d", 
+                               dwState,
+                               stStatus.dwCurrentState,
+                               stStatus.dwWin32ExitCode,
+                               stStatus.dwWaitHint,
+                               stStatus.dwServiceSpecificExitCode);
+               }
+
+       } else {
+               apxLogWrite(APXLOG_MARK_ERROR "apxServiceControl(): 
QueryServiceStatus failure");
+       }
 
-    return FALSE;
+       apxLogWrite(APXLOG_MARK_ERROR "apxServiceControl(): returning FALSE");
+       return FALSE;
 }
 
 BOOL


Reply via email to