我正在研究futex
在将数据从文件传输到perf record
显示的套接字的应用程序中频繁调用syscall .
我试图用gdb附加到jvm并在futex系统调用上设置catch点,然后打印backtrace
s以了解它的来源.问题是bt
失败并出现一些内部错误:
gdb -p <jvm_pid>
(gdb) catch syscall futex
Catchpoint 1 (syscall 'futex' [202])
(gdb) continue
Continuing.
Thread 2 "java" received signal SIGSTOP, Stopped (signal).
[Switching to Thread 0x7fa60385c700 (LWP 27739)]
0x00007fa602a0e9f3 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib/x86_64-linux-gnu/libpthread.so.0
(gdb) backtrace
/build/gdb-GT4MLW/gdb-8.1/gdb/frame.c:534: internal-error: frame_id get_frame_id(frame_info*): Assertion `fi->level == 0' failed.
A problem internal to GDB has been detected,
further debugging may prove unreliable.
Run Code Online (Sandbox Code Playgroud)
所以最终我得到了以下内容:
Python Exception <class 'KeyboardInterrupt'> Quit:
#0 0x00007fa602a0e9f3 in …
Run Code Online (Sandbox Code Playgroud) 我正在开发一些 JIT 编译器,我正在使用 GDB 来首次亮相,我的代码在某个时刻崩溃(段错误),但它在 jitted 代码处崩溃(它们是动态生成的),所以我没有得到堆栈帧信息,但我得到以下回溯:
#0 0x0000000001d98f22 in ?? () // JITTED CODE
#1 0x000000000000001d in ?? () // JITTED CODE
#2 ...callattribuite function....
Run Code Online (Sandbox Code Playgroud)
我想知道 GDB 是否可以反汇编位置 0x0000000001d98f22 处的代码并将其显示给我。我尝试过disas 0x0000000001d98f22
,但 GDB 抱怨No function contains specified address.
编辑:我自己也修复了这个问题,该disas
命令需要一个结束地址才能正常工作。
我们有一个由 GnatPro 19.2 编译的 Ada 共享库,我们通过 JNA 调用来调用它。
我们的应用程序在 windows 下运行良好。在 Linux 下移植时,应用程序随机崩溃并出现 Ada 异常:
storage error or erroneous memory access.
Run Code Online (Sandbox Code Playgroud)
使用 gdb 调试(附加进程)并没有多大帮助。我们得到各种 SIGSEGV,我们继续,一段时间后我们得到存储错误,没有可用的调用堆栈。
我们的共享库可以与 python 本机调用一起使用,没有任何问题。问题可能出在 Java 方面。
尝试切换 JVM(openjdk 或官方 jdk)但没有运气。
为什么是这样?有没有办法解决它?
我写了以下代码:
public class JavaErrorTest {
public static void main(String[] args) {
if (1 < 2) {
throw new OutOfMemoryError();
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后我调用它:
$ java -XX:OnError="echo %p" JavaErrorTest
Run Code Online (Sandbox Code Playgroud)
在我的控制台中,我得到以下内容:
Exception in thread "main" java.lang.OutOfMemoryError
at JavaErrorTest.main(JavaErrorTest.java:5)
Run Code Online (Sandbox Code Playgroud)
不知何故,我怀疑-XX:OnError
JVM选项没有被选中.我正在使用cygwin调用java,使用jdk 1.6.0_30,在Windows 64位下运行.
我究竟做错了什么?
编辑
以下命令产生相同的输出:
$ java -XX:OnOutOfMemoryError="echo %p" JavaErrorTest
Run Code Online (Sandbox Code Playgroud)