JNA вызывает EXCEPTION_ACCESS_VIOLATION? - PullRequest
2 голосов
/ 19 декабря 2008

Мой пользовательский интерфейс Java неожиданно прервался и выгрузил файл hs_err_pid. В файле говорится: «Сбой произошел за пределами виртуальной машины Java в собственном коде». JNA - единственный нативный код, который мы используем. Кто-нибудь знает какие-либо известные проблемы или ошибки с любой версией JNA, которые могут вызвать это. Я включил часть содержимого из файла ошибок ниже.

An unexpected error has been detected by Java Runtime Environment:

EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x6d02bcbd, pid=312, tid=3616

 Java VM: Java HotSpot(TM) Client VM (11.0-b16 mixed mode, sharing windows-x86)<br>
 Problematic frame:
 C  [awt.dll+0x2bcbd]

 If you would like to submit a bug report, please visit:
   http://java.sun.com/webapps/bugreport/crash.jsp
 The crash happened outside the Java Virtual Machine in native code.
 See problematic frame for where to report the bug.

Current thread (0x02acf000):  JavaThread "AWT-Windows" daemon [_thread_in_native, id=3616, stack(0x02eb0000,0x02f00000)]

siginfo: ExceptionCode=0xc0000005, writing address 0xe2789280


Registers:
EAX=0x234f099c, EBX=0x00001400, ECX=0x00000100, EDX=0xe2789280
ESP=0x02eff4a4, EBP=0x00000400, ESI=0x234f099c, EDI=0xe2789280
EIP=0x6d02bcbd, EFLAGS=0x00010206

Top of Stack: (sp=0x02eff4a4)
0x02eff4a4:   02eff500 00000100 02eff584 00000100
0x02eff4b4:   6d0a5697 00000400 00000400 00000100
0x02eff4c4:   00000100 02eff700 02eff500 00000000
0x02eff4d4:   00000000 00000100 041ac3a0 00000100
0x02eff4e4:   00182620 00000400 e2789280 00000000
0x02eff4f4:   00000000 00000100 00000100 00000000
0x02eff504:   00000000 00000100 00000100 00000000
0x02eff514:   00000000 00000004 00000400 00000000

Instructions: (pc=0x6d02bcbd)
0x6d02bcad:   00 00 00 8b 4c 24 14 8b e9 c1 e9 02 8b f0 8b fa
0x6d02bcbd:   f3 a5 8b cd 83 e1 03 f3 a4 8b 74 24 18 8b 4c 24

Stack: [0x02eb0000,0x02f00000],  sp=0x02eff4a4,  free space=317k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C  [awt.dll+0x2bcbd]

[error occurred during error reporting (printing native stack), id 0xc0000005]

Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j  sun.awt.windows.WToolkit.eventLoop()V+0
j  sun.awt.windows.WToolkit.run()V+69
j  java.lang.Thread.run()V+11
v  ~StubRoutines::call_stub

Ответы [ 4 ]

3 голосов
/ 21 января 2009

Я только что столкнулся с той же самой ошибкой, она, очевидно, является ошибкой в ​​новой ускоренной Direct2d функциональности Java2d с 1.6.0_11, которая возникает на машинах с низкой видео-памятью. Если вы запускаете приложение с параметром -Dsun.java2d.d3d = false, оно должно работать снова. Отслеживание солнечной ошибки заключается в следующем: http://bugs.sun.com/view_bug.do?bug_id=6788497

1 голос
/ 29 декабря 2008

Просто потому, что единственная часть нативного кода, который вы сознательно используете, - это JNI / что бы не означало сбой, подобный вашему, связан с ним в местоположении или во времени. В любой конкретной JVM / работе есть всякая встроенная поддержка, и одно время я получал причудливые сбои, вызванные в результате повреждением, произошедшим намного раньше, и самой JVM.

В моем случае я обнаружил захватывающие ошибки в потоке параллельного GC на моем новом блестящем многопроцессорном блоке (Niagara), который оставлял все виды бомб в ожидании взлета, и у меня было нет не-JDK нативный код в моем приложении вообще.

Когда команда Sun GC исправила ошибку (и очень любезно предоставила мне тестовую бутлеговую виртуальную машину), мои проблемы испарились (ну, после раунда или двух, естественно).

1009 * Rgds *

Damon

1 голос
/ 19 декабря 2008

Судя по:

Stack: [0x02eb0000,0x02f00000], sp=0x02eff4a4, free space=317k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C [awt.dll+0x2bcbd]

(в этот момент трассировка стека явно взорвалась) вы можете столкнуться с ошибкой в ​​библиотеке AWT.

0 голосов
/ 29 декабря 2008

Вы столкнулись с нарушением прав доступа, что означает, что какой-то код пытался получить доступ к адресу, к которому он не разрешен, часто из-за отсутствия памяти по данному адресу. Трассировка стека указывает на местоположение, которое вызвало проблему, которая может или не может быть источником проблемы. Люди иногда забывают об этом, когда говорят о нативном коде, даже если знают об этом иначе.

Я использовал JNA, но у меня никогда не было с этим проблем. Если было нарушение доступа, это была моя вина. Вот несколько простых советов.

Убедитесь, что ваша машина физически исправна. Проверьте свою память с помощью Memtest86 + . Бесполезно искать программную ошибку, если это аппаратная проблема.

Посмотрите на код, используя JNA. Имейте в виду, что даже если вызовы в Java выглядят незаметно, вы пишете код низкого уровня, который может связываться с чем угодно. Вполне возможно, что код, использующий JNA, делает что-то не так и портит память. Например, убедитесь, что используется правильное соглашение о вызовах и выравнивание данных. Если вы сомневаетесь, попросите кого-то, кто чувствует себя комфортно с C (или, в более общем смысле, с вещами низкого уровня), помочь вам.

Не исключайте полностью других факторов. Вполне возможно, что вы столкнулись с ошибкой JVM или чем-то еще, но будьте осторожны, насколько это вероятно. Если вы слышите удары копыт, подумайте о лошадях, а не о зебрах.

...