Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c和x2B中的信号10(SIGBUS)+;作为启动守护进程运行应用程序时的库 我有一个java应用程序,它启动C++助手应用程序从数据库中检索信息(涉及旧的32位驱动程序的长故事)。当我手动运行应用程序时,一切都很好,C++应用程序运行,java应用程序消耗输出。但是当java应用程序作为启动程序守护进程时,C++助手程序返回的值为138,我确信总线错误10。_Java_C++_Macos_Launchd - Fatal编程技术网

c和x2B中的信号10(SIGBUS)+;作为启动守护进程运行应用程序时的库 我有一个java应用程序,它启动C++助手应用程序从数据库中检索信息(涉及旧的32位驱动程序的长故事)。当我手动运行应用程序时,一切都很好,C++应用程序运行,java应用程序消耗输出。但是当java应用程序作为启动程序守护进程时,C++助手程序返回的值为138,我确信总线错误10。

c和x2B中的信号10(SIGBUS)+;作为启动守护进程运行应用程序时的库 我有一个java应用程序,它启动C++助手应用程序从数据库中检索信息(涉及旧的32位驱动程序的长故事)。当我手动运行应用程序时,一切都很好,C++应用程序运行,java应用程序消耗输出。但是当java应用程序作为启动程序守护进程时,C++助手程序返回的值为138,我确信总线错误10。,java,c++,macos,launchd,Java,C++,Macos,Launchd,经过一些相当痛苦的调试,我已经能够确定信号发生在ODBC驱动程序本身内部。由于我无法访问ODBC驱动程序的源代码,因此我的调试选项受到限制 我的问题是,我的launchd plist设置中是否遗漏了任何有助于解释正在发生的事情的内容,或者是否有某种沙箱正在进行,可能导致我的问题 我是一个OSX新手,所以我对launchd的总体经验很少 这是我当前的plist设置 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUB

经过一些相当痛苦的调试,我已经能够确定信号发生在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>

从堆栈跟踪中可以明显看出这一点(当格式化为可读性时)☺) 这是怎么回事

这显然是。它正在调用
strlen()
。它命中了
NULL
指针。
strlen()
由库内部
\u LoadOdbcIni()
函数调用

我的猜测是,ODBC驱动程序使用了一个
.INI
文件,它从一个环境变量中获取该文件的位置。您已经在桌面配置文件/shell概要文件/whatever中设置了该环境变量。但它不在您的plist中,也不在
launchd
调用dæmon时设置

驱动程序中的代码调用
std::getenv()
来获取环境变量,该变量返回
NULL
。编写库不是为了期望环境变量丢失。它只是调用
strlen()
在该
NULL
指针上,不检查它。和-bang!-
SIGBUS
KERN\u PROTECTION\u尝试访问地址
0x0000000000000000
时出现故障


从4D文档(无论是什么)、4D技术支持或其他来源了解驱动程序需要哪些环境变量才能生成该
.INI
文件(以及其他任何内容);并将其设置在plist中。
man launchd.plist
了解如何执行此操作。

总线错误?我记得,这通常是由于指针未对齐造成的。是的,这对我来说没有任何意义。我可能误解了退出值138,但我能找到的一点提示我出现总线错误。我怀疑这是驱动程序中的错误本身,但我无法想象当运行正常时,它会导致什么工作,但当守护进程运行时失败。您是否通过JNI调用C++代码?我没有理解启动java应用程序的方式会导致C++ CODENO中的错误,它只是通过运行时执行的shell调用。你说得对,守护进程有一组完全不同的可用环境变量。驱动程序正在查找用户变量,以确定在何处查找用户odbc.ini文件。我将该变量添加到plist文件后,一切都开始工作。非常感谢,这是我的一大负担。
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