- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个通过 JNI 运行 Java 的 C 应用程序。 Java 应用程序启动,执行一些操作,一两秒后我得到 SIGSEGV 或 SIGBUS 。没有 java 故障转储文件。
这是崩溃的地方:
libjvm.dylib`jni_CallStaticVoidMethod:
0x104ad1653 <+0>: pushq %rbp
0x104ad1654 <+1>: movq %rsp, %rbp
0x104ad1657 <+4>: pushq %r15
0x104ad1659 <+6>: pushq %r14
0x104ad165b <+8>: pushq %r12
0x104ad165d <+10>: pushq %rbx
0x104ad165e <+11>: subq $0x150, %rsp
0x104ad1665 <+18>: movq %rdx, %rbx
0x104ad1668 <+21>: movq %rsi, %r14
0x104ad166b <+24>: movq %rdi, %r15
0x104ad166e <+27>: testb %al, %al
0x104ad1670 <+29>: je 0x104ad16aa ; <+87>
0x104ad1672 <+31>: movaps %xmm0, -0x140(%rbp)
0x104ad1679 <+38>: movaps %xmm1, -0x130(%rbp)
0x104ad1680 <+45>: movaps %xmm2, -0x120(%rbp)
0x104ad1687 <+52>: movaps %xmm3, -0x110(%rbp)
0x104ad168e <+59>: movaps %xmm4, -0x100(%rbp)
0x104ad1695 <+66>: movaps %xmm5, -0xf0(%rbp)
0x104ad169c <+73>: movaps %xmm6, -0xe0(%rbp)
0x104ad16a3 <+80>: movaps %xmm7, -0xd0(%rbp)
0x104ad16aa <+87>: movq %r9, -0x148(%rbp)
0x104ad16b1 <+94>: movq %r8, -0x150(%rbp)
0x104ad16b8 <+101>: movq %rcx, -0x158(%rbp)
0x104ad16bf <+108>: movq %r15, %rdi
0x104ad16c2 <+111>: callq 0x104c8c550 ; JavaThread::thread_from_jni_environment(JNIEnv_*)
0x104ad16c7 <+116>: movq %rax, %r12
0x104ad16ca <+119>: movq %r12, -0x28(%rbp)
0x104ad16ce <+123>: leaq -0x28(%rbp), %rdi
0x104ad16d2 <+127>: movl $0x6, %esi
0x104ad16d7 <+132>: callq 0x104926aac ; ThreadStateTransition::trans_from_native(JavaThreadState)
0x104ad16dc <+137>: movq %r12, -0x30(%rbp)
0x104ad16e0 <+141>: movq %r12, -0x50(%rbp)
0x104ad16e4 <+145>: movq $0x0, -0x48(%rbp)
0x104ad16ec <+153>: cmpq $0x0, 0x8(%r12)
0x104ad16f2 <+159>: je 0x104ad16fd ; <+170>
0x104ad16f4 <+161>: leaq -0x50(%rbp), %rdi
0x104ad16f8 <+165>: callq 0x104c5cf7c ; WeakPreserveExceptionMark::preserve()
0x104ad16fd <+170>: movq %r14, %rsi
0x104ad1700 <+173>: movq %r15, %rdi
0x104ad1703 <+176>: movq %rbx, %rdx
0x104ad1706 <+179>: nop
0x104ad1707 <+180>: nopl (%rax)
0x104ad170b <+184>: leaq -0x170(%rbp), %rax
0x104ad1712 <+191>: movq %rax, -0x58(%rbp)
0x104ad1716 <+195>: leaq 0x10(%rbp), %rax
0x104ad171a <+199>: movq %rax, -0x60(%rbp)
0x104ad171e <+203>: movl $0x30, -0x64(%rbp)
0x104ad1725 <+210>: movl $0x18, -0x68(%rbp)
0x104ad172c <+217>: movl $0xe, -0x78(%rbp)
0x104ad1733 <+224>: movq (%rbx), %rax
0x104ad1736 <+227>: movq 0x8(%rax), %rax
0x104ad173a <+231>: movzwl 0x22(%rax), %ecx
0x104ad173e <+235>: movq 0x8(%rax), %rax
0x104ad1742 <+239>: movq 0x50(%rax,%rcx,8), %rsi
0x104ad1747 <+244>: leaq -0xb8(%rbp), %r14
0x104ad174e <+251>: movq %r14, %rdi
0x104ad1751 <+254>: callq 0x104ca2c14 ; SignatureIterator::SignatureIterator(Symbol*)
0x104ad1756 <+259>: movl $0x63, -0xa0(%rbp)
0x104ad1760 <+269>: movq $0x0, -0x98(%rbp)
0x104ad176b <+280>: leaq 0x4f827e(%rip), %rax ; vtable for JNI_ArgumentPusherVaArg
0x104ad1772 <+287>: addq $0x10, %rax
0x104ad1776 <+291>: movq %rax, -0xb8(%rbp)
0x104ad177d <+298>: movq -0x58(%rbp), %rax
0x104ad1781 <+302>: movq %rax, -0x80(%rbp)
0x104ad1785 <+306>: movq -0x68(%rbp), %rax
0x104ad1789 <+310>: movq -0x60(%rbp), %rcx
0x104ad178d <+314>: movq %rcx, -0x88(%rbp)
0x104ad1794 <+321>: movq %rax, -0x90(%rbp)
0x104ad179b <+328>: leaq -0x78(%rbp), %rsi
0x104ad179f <+332>: movq %r15, %rdi
0x104ad17a2 <+335>: movq %rbx, %rdx
0x104ad17a5 <+338>: movq %r14, %rcx
0x104ad17a8 <+341>: movq %r12, %r8
0x104ad17ab <+344>: callq 0x104ad8877 ; jni_invoke_static(JNIEnv_*, JavaValue*, _jobject*, JNICallType, _jmethodID*, JNI_ArgumentPusher*, Thread*)
0x104ad17b0 <+349>: cmpq $0x0, 0x8(%r12)
0x104ad17b6 <+355>: jne 0x104ad17bf ; <+364>
0x104ad17b8 <+357>: nop
0x104ad17b9 <+358>: nopl (%rax)
0x104ad17bd <+362>: jmp 0x104ad17c4 ; <+369>
0x104ad17bf <+364>: nop
0x104ad17c0 <+365>: nopl (%rax)
0x104ad17c4 <+369>: cmpq $0x0, -0x48(%rbp)
0x104ad17c9 <+374>: je 0x104ad17d4 ; <+385>
0x104ad17cb <+376>: leaq -0x50(%rbp), %rdi
0x104ad17cf <+380>: callq 0x104c5cefa ; WeakPreserveExceptionMark::restore()
0x104ad17d4 <+385>: leaq -0x30(%rbp), %rdi
0x104ad17d8 <+389>: callq 0x1048ffc80 ; HandleMarkCleaner::~HandleMarkCleaner()
0x104ad17dd <+394>: leaq -0x28(%rbp), %rdi
0x104ad17e1 <+398>: movl $0x6, %esi
0x104ad17e6 <+403>: movl $0x4, %edx
0x104ad17eb <+408>: callq 0x104931e04 ; ThreadStateTransition::trans_and_fence(JavaThreadState, JavaThreadState)
0x104ad17f0 <+413>: addq $0x150, %rsp
0x104ad17f7 <+420>: popq %rbx
0x104ad17f8 <+421>: popq %r12
0x104ad17fa <+423>: popq %r14
0x104ad17fc <+425>: popq %r15
0x104ad17fe <+427>: popq %rbp
0x104ad17ff <+428>: retq
调试器指向该行(在上面的代码中):
0x104ad17b0 <+349>: cmpq $0x0, 0x8(%r12)
next 指向此代码的第一行作为原因(它没有说明此代码来自何处):
-> 0x1058e5535: movl 0xc(%rdx), %r10d
0x1058e5539: movl 0xc(%r12,%r10,8), %ebx
0x1058e553e: movl 0x10(%rsi), %r8d
0x1058e5542: movl 0xc(%r12,%r8,8), %r9d
0x1058e5547: movl %r9d, 0x14(%rsp)
0x1058e554c: movl 0xc(%rsi), %r11d
0x1058e5550: movl %ebx, %ebp
0x1058e5552: addl %r11d, %ebp
正如我所说,这不会立即发生 - Java 应用程序设法做一些事情。当我尝试使用 AWT gui 类时,显然会发生崩溃。另外,日志显示这一行(不确定这是否相关):
WARNING: GL pipe is running in software mode (Renderer ID=0x1020400)
这是 JVM 错误吗?我应该如何进行?
编辑:
相关源码:
void* runJava(void* arg) {
JNIEnv *env;
JavaVM * jvm;
int nOptions = 1;
char jvmLibPath[PATH_MAX];
if (! jreSearch(jvmLibPath)) {
return NULL;
}
void* handle = dlopen(jvmLibPath, RTLD_LAZY);
NSLog(@"loaded jvm library %s\n", jvmLibPath);
if (handle == NULL) {
NSLog(@"error: %s\n", dlerror());
exit(EXIT_FAILURE);
}
PtrCreateJavaVM ptrCreateJavaVM = (PtrCreateJavaVM) dlsym(handle, "JNI_CreateJavaVM");
if (ptrCreateJavaVM == NULL) {
fprintf(stderr, "%s\n", dlerror());
exit(EXIT_FAILURE);
}
JavaVMOption* options = (JavaVMOption*) malloc(sizeof(JavaVMOption) * (nOptions));
options[0].optionString = "-Djava.class.path=../MyJavaApp.jar";
JavaVMInitArgs vm_args;
vm_args.version = JNI_VERSION_1_8;
vm_args.nOptions = nOptions;
vm_args.options = options;
vm_args.ignoreUnrecognized = 0;
int ret = ptrCreateJavaVM(&jvm, (void**) &env, &vm_args);
if (ret < 0)
NSLog(@"\nUnable to Launch JVM\n");
if (env == NULL) {
exit(EXIT_FAILURE);
}
jclass mainClass = (*env)->FindClass(env, "mainpackage.MyMainClass");
if (mainClass == 0) {
NSLog(@"Failed to find class (or it's dependencies)");
}
jmethodID mainMethod = (*env)->GetStaticMethodID(env, mainClass, "main", "([Ljava/lang/String;)V");
if (mainMethod == 0) {
NSLog(@"Failed to acquire main() method of main class\n");
exit(EXIT_FAILURE);
}
NSArray *args = [[NSProcessInfo processInfo] arguments];
int argc_ =(int)[args count];
char** argv_ = getArray(args);
//application name is not passed to java app, hence (argc - 1)
jobjectArray appArgs = (*env)->NewObjectArray(env, argc_ - 1,(*env)->FindClass(env, "java/lang/String"), NULL);
int i;
for (i = 0; i < argc_ - 1; i = i + 1) {
//argv[i + 1] skipps application name
jstring arg = (*env)->NewStringUTF(env, argv_[i + 1]);
(*env)->SetObjectArrayElement(env, appArgs, i, arg);
}
NSLog(@"calling main method\n");
(*env)->CallStaticVoidMethod(env, mainClass, mainMethod, appArgs);
NSLog(@"after main method\n");
(*jvm)->DestroyJavaVM(jvm);
if (options != NULL) {
int i;
for (i = 0; i < nOptions; i++) {
free(options[i].optionString);
}
}
NSLog(@"JVM destroyed\n");
freeArray(argv_);
pthread_mutex_lock(&javaFinishedMutex);
pthread_cond_signal(&javaFinishedCond);
pthread_mutex_unlock(&javaFinishedMutex);
return NULL;
}
最佳答案
显然 JVM 在内部使用 SIGBUS/SIGSEGV 来控制应用程序(?)。我让 mu 调试器将这些信号传递给应用程序,现在一切都很好。
关于java - OS X Mavericks JNI CallStaticVoidMethod 结果为 SIGSEGV/SIGBUS (Java 8),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31028467/
在几个 SO 的问题中,有这些行可以访问代码的父目录,例如os.path.join(os.path.dirname(__file__)) returns nothing和 os.path.join(o
我想用 Python 更改文件模式。 os 模块具有三个功能上看似相同的功能: os.chmod os.fchmod os.lchmod 这三个版本有什么区别? 最佳答案 chmod 用于更改路径指定
考虑: pipe_read, pipe_write = os.pipe() 现在,我想知道两件事: (1) 我有两个线程。如果我保证只有一个正在读取 os.read(pipe_read,n) 而另一个
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
让我们以硬盘驱动器/网络接口(interface)为例。它由多个进程共享。现在多个进程可能会向硬盘驱动器发出并发命令来读取数据。当数据可用时,内核如何知道哪个进程的数据已准备好?操作系统和硬盘驱动器之
嗨,我正在尝试编写像这样的原子写入函数...... with tempfile.NamedTemporaryFile(mode= "w", dir= target_directory) as f:
net.Conn接口(interface)提供了 SetTimeout 方法,我应该用 os.Timeout 检查返回的错误.但是我看不到在返回的 os.Error 上调用 os.Timeout 的方
我正在使用 os 模块在我的 Django 项目 settings.py 文件中具有相对路径。变量 SITE_ROOT 设置为 settings.py 文件的当前工作目录,然后用于引用同样位于同一目录
正如我们所知,Windows 接受 "\" 和 "/" 作为分隔符。但是在python中,使用的是"\"。例如,调用 os.path.join("foo","bar"),将返回 'foo\\bar'。
我有以下工作目录:/Users/jordan/Coding/Employer/code_base ,我想要获取绝对路径的文件位于 /Users/jordan/Coding/Employer/code_
在 Python 中,如果路径中包含“~”,我能否确定扩展的用户调用将是绝对路径? 例如,这个表达式是否总是为真? path = '~/.my_app' os.path.expanduser(path
我是 Django 项目的初学者。Django 项目的 settings.py 文件包含这两行: BASE_DIR = os.path.dirname(os.path.dirname(os.path.
我有一个旧 MAC OS 文件存储中的文件集合。我知道集合存在文件名/路径名问题。问题源于我认为在原始操作系统中呈现为破折号的路径中包含一个代码点,但 Windows 与代码点斗争,并且其中一个包含
Ubuntu怎么安装mac os x主题呢?下文小编将为大家分享ubuntu14.04安装mac os x主题教程,安装MAC OS X&
我有一个 Firefox OS 应用程序,我希望在该应用程序之外打开一个链接(该链接指向不同的站点,在应用程序中打开它会使应用程序在没有强制的情况下无法使用)。我怎么做? Related bug re
我想为 Firefox OS 编写我的应用程序.使用什么样的语言(如 Android 的 Java 和 iOS 的 Objective C++)和工具(如 Eclipse、Xcode)? 最佳答案 适
我正在尝试创建一个 Palm OS 应用程序,以每 X 分钟或几小时检查一次网站,并在有数据可用时提供通知。我知道这种事情可以在新的 Palm 上完成——例如,当应用程序不在顶部时,我的 Centro
我需要在 Firefox OS 中显示全屏图像。我有一个具有 qHD 分辨率(960x540 像素)的“峰值”开发预览手机。 如何确保我的应用程序在其他具有不同屏幕分辨率的 firefox-os 设备
我正在尝试在 Firefox OS 中安装一个新的语言环境,但我不确定我是否正确地按照这些步骤操作。 首先,我尝试使用 Mercurial 下载所需的语言环境:它对我不起作用,Mercurial 说访
我有这个shell脚本Test.sh: #! /bin/bash FILE_TO_CHECK="/Users/test/start.txt" EXIT=0 while [ $EXIT -eq 0 ];
我是一名优秀的程序员,十分优秀!