我已经使用以下说明为 Windows 构建了 openj9:https://github.com/eclipse/openj9/blob/master/buildenv/Build_Instructions_V8.md#windows
当我尝试以下代码时(Visual Studio 2017):
J9PortLibraryVersion portver;
J9PORT_SET_VERSION(&portver, J9PORT_CAPABILITY_MASK);
J9PortLibrary *portlib;
int32_t rc = j9port_allocate_library(&portver, &portlib);
if (rc != 0)
{
printf("j9port_allocate_library failed with: %d\n", rc);
return 1;
}
rc = j9port_create_library(portlib, &portver, sizeof(J9PortLibrary));
if (rc != 0)
{
printf("j9port_create_library failed with %d\n", rc);
return 1;
}
rc = j9port_startup_library(portlib);
if (rc != 0)
{
printf("j9port_startup_library failed with %d\n", rc);
return 1;
}
printf("j9port_startup_library: %d\n", rc);
我在 j9port_startup_library
上遇到访问冲突:exception throw at 0x00007FFF0FC9430A (j9thr29.dll) in sample.exe: 0xC0000005: Access violation reading location 0x0000000000000000。
检查 portlib 表明 portGlobals 是 NULL
,我认为它不应该是。
当我在调试器之外运行 exe 时,我看到以下断言(由于某种原因我在调试器中看不到):
** ASSERTION FAILED ** j9prt.504 at common/j9port.c:404 Assert_PRT_true((omrthread_self() != ((void *)0)))
** ASSERTION FAILED ** omrport.0 at ../../omr/port/common/omrport.c:515 Assert_PRT_true((omrthread_self() != ((void *)0)))
我是否遗漏了一个步骤或者是什么导致了此访问冲突?
编辑:我使用 Visual Studio 2010 在 Windows 7 x64 上重建项目并在 VS2010 中运行在 MCE 之上,VS 显示我们崩溃了
omrthread.c
static omrthread_monitor_t
monitor_allocate(omrthread_t self, intptr_t policy, intptr_t policyData)
{
omrthread_monitor_t newMonitor;
omrthread_library_t lib = self->library;
最佳答案
这是在 Eclipse OpenJ9 github 项目中提出的:https://github.com/eclipse/openj9/issues/1564
答案是初始化端口库如下:
int main(int argc, char **argv) {
omrthread_t attachedThread = NULL;
J9PortLibraryVersion portver;
J9PortLibrary portlib;
intptr_t rc;
intptr_t fd;
rc = omrthread_init_library();
if (rc != 0) {
printf("omrthread_init_library failed with: %lld\n", rc);
return 1;
}
rc = omrthread_attach_ex(&attachedThread, J9THREAD_ATTR_DEFAULT);
if (rc != 0) {
printf("omrthread_attach_ex failed with: %lld\n", rc);
return 1;
}
J9PORT_SET_VERSION(&portver, J9PORT_CAPABILITY_MASK);
rc = j9port_init_library(&portlib, &portver, sizeof(portlib));
if (rc != 0) {
printf("j9port_init_library failed with: %lld\n", rc);
return 1;
}
关于java - 调用 j9port_startup_library 时发生访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49535954/