2014-12-02 13 views
14

Cố gắng chạy ứng dụng java từ kết quả gdb trong segfault, nhưng chạy ứng dụng một mình thì không. Ứng dụng này là một .JAR sử dụng JOGL và một chút ánh xạ bộ nhớ để nói chuyện với GPU.Tại sao ứng dụng java bị hỏng trong gdb nhưng chạy bình thường trong cuộc sống thực?

Stacktrace dưới đây gợi ý về một số loại vấn đề truy cập bộ nhớ nhưng tôi không hiểu tại sao nó thể hiện trong GDB nhưng không phải trong cuộc sống thực. Có thể có một số yếu tố môi trường gdb cần biết để cho phép thực hiện đúng không?

Sự cố này vẫn tồn tại giữa các JVMs OpenJDK 6 và 7, cũng như Oracle JRE 7. The JRE oracle chạy xa hơn một chút để khởi động trước khi segfault. Tất cả các segfaults là khác nhau trong sự xuất hiện và vị trí giữa các thử nghiệm.

Segfault vẫn tồn tại giữa các GPU và trình điều khiển (!!): nvidia, radeon, fglrx hiện tại và fglrx beta (14.xx). GDB sẽ đính kèm thành công vào một cá thể đã chạy của chương trình của tôi, tuy nhiên dường như không có khả năng cho gDEBugger thực hiện điều này, đó là điều cuối cùng cần làm.

Không có ý định thực sự gỡ lỗi với gdb. Thay vào đó tôi đang cố gắng sử dụng gDEBugger để thực hiện gỡ lỗi OpenGL. gDEBugger dường như dựa vào GDB như là một phần của phần phụ trợ của nó, vì vậy nếu GDB không thành công, thì gDEBugger cũng vậy. Điều này dẫn đến những nỗ lực để chạy gdb một mình để cô lập vấn đề.

gDEBugger output: 
GDB String: [Thread debugging using libthread_db enabled] 
GDB String: Using host libthread_db library /lib/x86_64-linux-gnu/libthread_db.so.1 . 
Thread Created: 140737353893632 (LWP: 3265) 
Thread Created: 140737294624512 (LWP: 3266) 
Thread Created: 140737293571840 (LWP: 3267) 
Thread Created: 140737292519168 (LWP: 3268) 
Thread Created: 140737155180288 (LWP: 3269) 
Thread Created: 140737154127616 (LWP: 3270) 
Thread Created: 140736913602304 (LWP: 3271) 
Thread Created: 140736909629184 (LWP: 3272) 
Thread Created: 140736908576512 (LWP: 3273) 
Thread Created: 140736907523840 (LWP: 3274) 
Thread Created: 140736906471168 (LWP: 3275) 
Thread Created: 140736905418496 (LWP: 3276) 
Thread Created: 140736278275840 (LWP: 3277) 
Thread Created: 140736272963328 (LWP: 3278) 
Thread Created: 140736271910656 (LWP: 3279) 
Thread Created: 140736270857984 (LWP: 3280) 
Thread Created: 140736269805312 (LWP: 3281) 
Thread Created: 140737287657216 (LWP: 3285) 
Thread Created: 140736261945088 (LWP: 3289) 
GDB String: [Thread 0x7fffb6e67700 (LWP 3289) exited] 
Thread Created: 140736261945088 (LWP: 3290) 
API Connection Established: gDEBugger Servers Manager 
Thread Created: 140736234641152 (LWP: 3291) 
GDB String: [Thread 0x7fffb6e67700 (LWP 3290) exited] 
API Connection Established: gDEBugger OpenGL Server 
GDB String: [Thread 0x7fffb77e8700 (LWP 3279) exited] 
GDB String: [Thread 0x7fffb76e7700 (LWP 3280) exited] 
Debug String: gDEBugger OpenGL Server was initialized 
Thread Created: 140736270857984 (LWP: 3292) 
Thread Created: 140735692441344 (LWP: 3294) 
Thread Created: 140735582430976 (LWP: 3295) 
Thread Created: 140735574038272 (LWP: 3296) 
OpenGL Render Context 1 Created 
Signal: SIGSEGV 
Process Exit 


$ java -versionjava version "1.6.0_33" 
OpenJDK Runtime Environment (IcedTea6 1.13.5) (6b33-1.13.5-1ubuntu0.14.04) 
OpenJDK 64-Bit Server VM (build 23.25-b01, mixed mode) 

$ gdb -version 
GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.2) 7.7.1 

$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu 
DISTRIB_RELEASE=14.04 
DISTRIB_CODENAME=trusty 
DISTRIB_DESCRIPTION="Ubuntu 14.04.1 LTS" 

$ fglrxinfo 
display: :0.0 screen: 0 
OpenGL vendor string: Advanced Micro Devices, Inc. 
OpenGL renderer string: AMD Radeon HD 5570  
OpenGL version string: 4.4.12967 Compatibility Profile Context 14.20 


$ gdb --args java -jar RunMe.jar 
GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.2) 7.7.1 
Copyright (C) 2014 Free Software Foundation, Inc. 
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 
This is free software: you are free to change and redistribute it. 
There is NO WARRANTY, to the extent permitted by law. Type "show copying" 
and "show warranty" for details. 
This GDB was configured as "x86_64-linux-gnu". 
Type "show configuration" for configuration details. 
For bug reporting instructions, please see: 
<http://www.gnu.org/software/gdb/bugs/>. 
Find the GDB manual and other documentation resources online at: 
<http://www.gnu.org/software/gdb/documentation/>. 
For help, type "help". 
Type "apropos word" to search for commands related to "word"... 
Reading symbols from java...Reading symbols from /usr/lib/debug//usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java...done. 
done. 
(gdb) show configuration 
This GDB was configured as follows: 
    configure --host=x86_64-linux-gnu --target=x86_64-linux-gnu 
      --with-auto-load-dir=$debugdir:$datadir/auto-load 
      --with-auto-load-safe-path=$debugdir:$datadir/auto-load 
      --with-expat 
      --with-gdb-datadir=/usr/share/gdb (relocatable) 
      --with-jit-reader-dir=/usr/lib/gdb (relocatable) 
      --without-libunwind-ia64 
      --with-lzma 
      --with-python=/usr (relocatable) 
      --with-separate-debug-dir=/usr/lib/debug (relocatable) 
      --with-system-gdbinit=/etc/gdb/gdbinit 
      --with-zlib 
      --without-babeltrace 
(gdb) run 
Starting program: /usr/bin/java -jar RunMe.jar 
[Thread debugging using libthread_db enabled] 
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1". 
process 6866 is executing new program: /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java 
[Thread debugging using libthread_db enabled] 
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1". 
[New Thread 0x7ffff7fc4700 (LWP 6870)] 
[New Thread 0x7ffff486c700 (LWP 6871)] 
[New Thread 0x7ffff476b700 (LWP 6872)] 
[New Thread 0x7ffff466a700 (LWP 6873)] 
[New Thread 0x7fffea2d6700 (LWP 6874)] 
[New Thread 0x7fffea1d5700 (LWP 6875)] 
[New Thread 0x7fffea0d4700 (LWP 6876)] 
[New Thread 0x7fffe9d0a700 (LWP 6877)] 
[New Thread 0x7fffe9c09700 (LWP 6878)] 
[New Thread 0x7fffe9b08700 (LWP 6879)] 
[New Thread 0x7fffe9a07700 (LWP 6880)] 
[New Thread 0x7fffe9906700 (LWP 6881)] 
... 
[New Thread 0x7fffe8110700 (LWP 6882)] 
[New Thread 0x7fffe3169700 (LWP 6883)] 
[New Thread 0x7fffe3068700 (LWP 6884)] 
[New Thread 0x7fffe2f67700 (LWP 6885)] 
[New Thread 0x7fffe2e66700 (LWP 6886)] 
[New Thread 0x7fffe2d65700 (LWP 6887)] 
[Thread 0x7fffe2d65700 (LWP 6887) exited] 
[New Thread 0x7fffe2d65700 (LWP 6891)] 
[Thread 0x7fffe2d65700 (LWP 6891) exited] 
[New Thread 0x7fffe2d65700 (LWP 6895)] 
[Thread 0x7fffe2d65700 (LWP 6895) exited] 
[New Thread 0x7fffe2d65700 (LWP 6896)] 
[New Thread 0x7fffe0efd700 (LWP 6897)] 
libEGL warning: DRI2: failed to authenticate 
[New Thread 0x7fff9799f700 (LWP 6898)] 
[New Thread 0x7fff9719e700 (LWP 6899)] 
[New Thread 0x7fff9699d700 (LWP 6900)] 
[Thread 0x7fffe2d65700 (LWP 6896) exited] 
[New Thread 0x7fffe2d65700 (LWP 6901)] 
[New Thread 0x7fffe01ab700 (LWP 6902)] 
[New Thread 0x7fff92f00700 (LWP 6903)] 
[New Thread 0x7fff92dff700 (LWP 6904)] 
[New Thread 0x7fff92cfe700 (LWP 6905)] 
Setting up sound system...[New Thread 0x7fff92bfd700 (LWP 6906)] 

[New Thread 0x7fff92afc700 (LWP 6907)] 
[New Thread 0x7fff929fb700 (LWP 6908)] 
[New Thread 0x7fff928fa700 (LWP 6909)] 
[New Thread 0x7fff927f9700 (LWP 6910)] 
[New Thread 0x7fff926f8700 (LWP 6911)] 
[New Thread 0x7fff925f7700 (LWP 6912)] 

Program received signal SIGSEGV, Segmentation fault. 
[Switching to Thread 0x7fffe2f67700 (LWP 6885)] 
0x00007ffff6b3a770 in acl_CopyRight() 
    from /usr/lib/jvm/java-6-openjdk-amd64/jre/lib/amd64/server/libjvm.so 
(gdb) where 
#0 0x00007ffff6b3a770 in acl_CopyRight() 
    from /usr/lib/jvm/java-6-openjdk-amd64/jre/lib/amd64/server/libjvm.so 
#1 0x00007ffff6d51309 in Unsafe_CopyMemory2 (env=<optimized out>, 
    unsafe=<optimized out>, srcObj=0x0, srcOffset=140737008618496, dstObj=0x0, 
    dstOffset=140737006779392, size=1024) 
    at /build/buildd/openjdk-6-6b33-1.13.5/build/openjdk/hotspot/src/share/vm/prims/unsafe.cpp:689 
#2 0x00007fffed011790 in ??() 
#3 0x0000000000000400 in ??() 
#4 0x0000000000000000 in ??() 
Warning: the current language does not match this frame. 
(gdb) quit 
A debugging session is active. 

    Inferior 1 [process 6866] will be killed. 

Quit anyway? (y or n) y 

UPDATE: Chuyển sang AMD CodeXL (về cơ bản các hình thức mới nhất của gDEBugger) và tình hình vẫn không thay đổi nhiều.

Trả lời

25

Tại sao ứng dụng java gặp sự cố trong gdb nhưng chạy bình thường trong cuộc sống thực?

Vì nó không thực sự bị lỗi.

Java sử dụng tải tích lũy. Nếu con trỏ trỏ đến bộ nhớ địa chỉ, tải thành công. Hiếm khi con trỏ không trỏ đến bộ nhớ địa chỉ, và tải cố gắng tạo ra SIGSEGV ... mà thời gian chạy java chặn, làm cho bộ nhớ địa chỉ một lần nữa, và khởi động lại lệnh tải.

Khi gỡ lỗi chương trình java, người ta phải thường làm điều này:

(gdb) handle SIGSEGV nostop noprint pass 

Thật không may, nếu có một số mã JNI liên quan, và rằng đang SIGSEGV s, GDB sẽ vui vẻ bỏ qua dấu hiệu cho thấy là tốt, dẫn đến cái chết của quá trình kém hơn (đang được gỡ rối). Tôi đã không tìm thấy một giải pháp có thể chấp nhận được cho vấn đề thứ hai đó.

+3

Sau khi thử lệnh 'handle', tôi xác nhận rằng nó khắc phục sự cố trong GDB. – user515655

Các vấn đề liên quan