2010-10-08 88 views
1

我們目前有一個自動化系統,作爲處理衛星圖像的服務運行。該服務維護一個配置文件,在配置文件中我們應用某些腳本(python)將輸入的衛星圖像轉換爲更加可用的格式。腳本調用所需的應用程序,進行轉換。腳本本身由服務通過系統調用(「command」)(用c/C++編寫)。 (服務使用與用戶相同的帳戶)。調試Windows服務並嘗試查看它看到的內容

我們目前正在嘗試添加對另一個satelitte圖像格式的支持,該轉換器是一個來自ERDAS Imagine(importavhrr)的商業.exe(我們在腳本中執行了幾個步驟來更改投影)。

該腳本正常工作,直到它擊中的:

argslist = ['importavhrr.exe', '-in', '%s' % infn, '-out', '%s' % tmpimg1, '-gui', 'FALSE', '-correct', '-flyingheight', '833', '-rect', 'gcp', gcpfn] 
print "".join(argslist) 
p = subprocess.Popen(argslist, shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE) 
print str(p.communicate()) 

什麼結束了,現在正在發生的事情,importavhrr.exe只是坐在那裏,什麼也不做(它坐在那裏,用0 CPU使用率根據任務管理器,並且內存使用永不改變)。就好像它在等待某種用戶輸入。 (嘗試os.system,os.spawnv都產生相同的結果)我猜測某種GUI元素是以太彈出一個gui窗口的種類。從任務管理器關閉進程,將控制權返回給python。

注意:-gui FALSE/false/0參數應該防止gui彈出。但是如果數據不好(我通過破壞數據手動測試並通過腳本調用),會彈出一個錯誤窗口,顯示結果。

當我手動運行腳本(相同的文件,相同的工作目錄),它工作正常....腳本甚至工作時,我手動調用它使用相同的系統功能(其內部庫的一部分)作爲服務。

此外,使服務僅調用importavhrr.exe和環境變量的批處理文件也會導致importavhrr.exe掛起。

服務斜向: - 使用相同的用戶帳戶作爲一個我在登錄時 - - Python腳本設置30-40 envrioment變量ERDAS - 所有的環境變量設置正確(傾銷的環境變量時該腳本首先運行,並將它們與我打印郵件時得到的結果進行比較) - 將環境變量傳遞到子過程.Popen()產生相同的結果 - 公司拒絕幫助我們,因爲他們不支持從命令行運行程序(但是當用戶使用它時,它可以正常工作,而不是服務) - 在調試模式下運行服務可以正常工作。 - 我已重新啓動機器。

我不知所措,我想(和恐懼),ERDAS可執行文件正在製作某種錯誤消息窗口彈出窗口,但是我看了看,並且找不到任何方式來查看什麼服務看到。我一直試圖弄清楚這個問題已經有將近一週了,所以是的。

編輯

我抓起推薦的Process Explorer,並在堆棧線程找我有這樣的:

<snip ntoskrnl calls> 
ntdll.dll!KiFastSystemCallRet 
ntdll.dll!RtlSetLastWin32ErrorAndNtStatusFromNtStatus+0x301 
kernel32.dll!GetModuleHandleA+0xdf 

等待幾分鐘後,它變成這樣:

<snip ntoskrnl calls> 
ntdll.dll!KiFastSystemCallRet 
USER32.dll!ScrollWindowEx+0x121d 
USER32.dll!SoftModalMessageBox+0x6f8 
USER32.dll!MessageBoxTimeoutW+0x1d9 
USER32.dll!MessageBoxTimeoutW+0x5b 
USER32.dll!MessageBoxTimeoutA+0x9c 
USER32.dll!MessageBoxExA+0x1b 
USER32.dll!MessageBoxA+0x45 
elib.dll!esmg_GetLocalTapesDB+0x23b 
elib.dll!esmg_LogMessageFunc+0x13a 

好吧,它試圖展示一個窗口,我認爲。我不知道他們的行爲,看看有什麼可能導致esmg_LogMessageFunc崩潰。該功能是他們的開發工具的一部分,我有0訪問權限。此外,我從來沒有見過erdas記錄任何東西。

+0

你說在調試模式下運行服務工作正常。這是否意味着作爲服務運行的調試版本(即在SCM下,而不是作爲獨立程序)不會觸發問題? – 2010-10-09 17:40:34

+0

通過調試模式我的意思是使用調試開關的服務。這基本上運行該服務作爲一個普通的exe。 – UberJumper 2010-10-12 11:29:23

回答

1

嘗試使用任何假設能夠訪問windowstation的Windows API調用都會導致服務的安全上下文中出現問題。

您可以使用Sysinternals中的幾個工具來診斷這種事情。具體而言,請考慮使用Process Explorer來代替任務管理器,並使用Process Monitor來跟蹤特定進程的活動。

編輯:他們新的ProcDump工具可以用來獲得任何進程的核心轉儲,具有真正強大的觸發功能。 Mark Russinovich's Blog上的一些最新戰爭故事利用ProcDump來發現真正發生的事情。

爲了保持完整性,對用於調試服務的「官方」工具進行了很好的概述,其網址爲this KB article

1

您是否嘗試允許該服務與桌面交互,登錄到計算機並檢查錯誤框是否實際彈出?

+0

+1只要允許訪問桌面可能是最簡單的,假設你沒有部署到大型服務器農場...... – RBerteig 2010-10-08 20:44:41

+0

只是試過這個沒有區別。但好主意 – UberJumper 2010-10-08 21:03:19

1

您可能需要從Process Explorer開始。您可以看到這些線程的線程和堆棧。如果你真的覺得有一個開放的窗口,你可能會看到這個堆棧

kernel32.dll!RegisterWaitForInputIdle+0x49 

的底部,如果不奏效,那麼我獲得該過程的完全內存轉儲,然後使用WinDbg看看它在做什麼。