相关疑难解决方法(0)

什么是LD_PRELOAD技巧?

我最近在proggit看到了它的引用,并且(截至目前)它没有被解释.

我怀疑可能是它,但我不确定.

c linux environment-variables

321
推荐指数
6
解决办法
29万
查看次数

调试java时打印回溯

我正在研究futex在将数据从文件传输到perf record显示的套接字的应用程序中频繁调用syscall .

我试图用gdb附加到jvm并在futex系统调用上设置catch点,然后打印backtraces以了解它的来源.问题是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)

java linux jvm

5
推荐指数
0
解决办法
132
查看次数

GDB:查看某个地址的程序集?

我正在开发一些 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命令需要一个结束地址才能正常工作。

debugging gcc jit gdb gnu

4
推荐指数
1
解决办法
3434
查看次数

为什么在 JVM 下运行时,我的 Ada 共享库会出现“存储错误”

我们有一个由 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)但没有运气。

为什么是这样?有没有办法解决它?

java linux ada segmentation-fault gnat

3
推荐指数
1
解决办法
306
查看次数

使用java的-XX:OnError选项

我写了以下代码:

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:OnErrorJVM选项没有被选中.我正在使用cygwin调用java,使用jdk 1.6.0_30,在Windows 64位下运行.

我究竟做错了什么?

编辑

以下命令产生相同的输出:

$ java -XX:OnOutOfMemoryError="echo %p" JavaErrorTest
Run Code Online (Sandbox Code Playgroud)

java jvm

2
推荐指数
1
解决办法
3839
查看次数

标签 统计

java ×3

linux ×3

jvm ×2

ada ×1

c ×1

debugging ×1

environment-variables ×1

gcc ×1

gdb ×1

gnat ×1

gnu ×1

jit ×1

segmentation-fault ×1