2013-12-15 25 views
1

時,我有一個啓動一個C++輔助應用程序從數據庫中檢索信息(長的故事涉及舊的32個驅動程序)的Java應用程序。當我手動運行應用程序時,一切正常,C++應用程序運行並且Java應用程序使用輸出。但是當java應用程序作爲launchd守護程序運行時,C++幫助程序應用程序以退出值138返回,我確信這是總線錯誤10.信號10(SIGBUS)在C++庫運行的應用程序作爲守護的launchd

經過一些相當痛苦的調試之後,我已經能夠確定信號發生在ODBC驅動程序本身內部。由於我無法訪問ODBC驅動程序的源,因此我的調試選項是有限的。

我的問題是,我失去了我的launchd plist中設置任何可能有助於解釋所發生的事情或者是有某種沙箱事情可能會造成我的問題嗎?

我是一個新手OSX,所以我必須與一般的launchd的經驗非常少。

這是我目前的plist設置。

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
    <key>Label</key> 
    <string>com.my.package.name</string> 
    <key>ProgramArguments</key> 
    <array> 
     <string>java</string> 
     <string>-cp</string> 
     <string> my classpath</string> 
     <string> my main class</string> 
    </array> 
    <key>KeepAlive</key> 
    <true/> 
    <key>WorkingDirectory</key> 
    <string>my working directory</string> 
</dict> 
</plist> 

編輯: 我能得到一個崩潰的文件。這是錯誤和堆棧跟蹤。 dsn似乎在ini文件中設置正確,但我會繼續挖掘。

我能得到它崩潰文件,這裏是錯誤和堆棧跟蹤。

Exception Type: EXC_BAD_ACCESS (SIGBUS) 
Exception Codes: KERN_PROTECTION_FAILURE at 0x0000000000000000 

VM Regions Near 0: 
--> __PAGEZERO    0000000000000000-0000000000001000 [ 4K] ---/--- SM=NUL /Users/* 
    VM_ALLOCATE   0000000000001000-00000000000f7000 [ 984K] ---/--- SM=NUL 

Thread 0 Crashed:: Dispatch queue: com.apple.main-thread 

0 libsystem_c.dylib    0x905c47f0 strlen + 16 
1 com.4D.odbcdriver.v13   0x00308c14 _LoadOdbcIni() + 257 
2 com.4D.odbcdriver.v13   0x00309546 _GetStringFromSystemDSN(char const*, char const*, char*, int) + 60 
3 com.4D.odbcdriver.v13   0x0030967e SQLGetPrivateProfileStringW + 99 
4 com.4D.odbcdriver.v13   0x002f0ec9 CHConnection::CreateStringFromDSN(wchar_t const*, wchar_t const*, wchar_t const*) + 225 
5 com.4D.odbcdriver.v13   0x00307e4a internalSQLDriverConnectW(CHConnection*, void*, wchar_t*, short, wchar_t*, short, short*, unsigned short) + 311 
6 com.4D.odbcdriver.v13   0x002fcafb SQLDriverConnectW + 129 
7 org.iodbc.core     0x0025802d SQLDriverConnect_Internal + 2381 
8 org.iodbc.core     0x00259373 SQLDriverConnect + 323 
+0

總線錯誤?我記得,這通常是由於指針錯位。 –

+0

是的,它對我沒有任何意義。我可能會誤解138的退出價值,但是我能找到什麼可以指出我的公交誤差。 –

+0

我懷疑它是驅動程序本身的錯誤,但我無法想象當正常運行時會導致它的工作,但作爲守護程序運行時會失敗。 –

回答

1

這是從堆棧跟蹤(格式化的可讀性☺時),這是怎麼回事就相當明顯。

這顯然是4D ODBC driver。它叫strlen()。它已經命中了一個NULL指針。由圖書館內部的_LoadOdbcIni()函數調用strlen()

我的教育猜測是,ODBC驅動程序使用.INI文件,並且它從環境變量中獲取該文件的位置。你已經在你的桌面配置/ shell配置文件中設置了這個環境變量。但它不在你的plist中,並且在launchd調用你的mon時不會被設置。

驅動程序中的代碼調用std::getenv()獲取環境變量,它返回NULL。該庫不是爲了期望缺少環境變量而編寫的。它只需在NULL指針上調用strlen()而不檢查它。和—砰! — SIGBUSKERN_PROTECTION_FAILURE當試圖訪問地址0x0000000000000000

從4D doco中查找,無論是從4D技術支持還是從其他來源,驅動程序都需要該文件(以及其他任何文件)需要的環境變量;並把它放在你的plist中。順便提一下,man launchd.plist關於如何做到這一點。

+0

你是對的,守護進程有一組完全不同的可用環境變量。驅動程序正在查找USER變量以確定在哪裏查找用戶odbc.ini文件。一旦我將這個變量添加到plist文件,一切都開始工作。非常感謝,這是我肩上的一大分量。 –

相關問題