Как отладить сбой с помощью Java Результат: код ошибки - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть приложение Java, которое использует C ++ DLL через JNA.C ++ DLL является частной собственностью, поэтому я не могу поделиться кодом, если не смогу привести упрощенный воспроизводимый пример.Непросто сделать воспроизводимый пример, пока я не продолжу отладку.

Приложение время от времени вылетает с сообщением об ошибке Java Result: -1073740940.Я запускаю Java-приложение из Netbeans, хотя оно не работает без Netbeans.Поскольку hs_err_.log нет, я полагаю, что сбой происходит на уровне C ++.Как я могу начать отлаживать этот сбой?

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Основной причиной сбоя было повреждение кучи на уровне C ++.Если происходит случайный сбой из-за повреждения кучи, иногда бывает сложно точно определить причину сбоя, потому что сбой может произойти позже, когда программа пытается манипулировать поврежденной памятью.Следовательно, также сложно предоставить SSCCE , особенно когда мы работаем над проприетарным устаревшим кодом.

Как я отлаживал этот сбой:

  • Воспроизведение: Попробуйте найти последовательный вариант использования для сбоя.Если сбой является случайным, попробуйте определить набор действий пользователя, которые всегда приводят к сбою.

  • Предположение: Угадайте, какая функция / компонент содержит сбой.

  • Проверка: Убедитесь, что сбоя не происходит при отключении этой функции / компонента.

  • Проверка : пролистайте и нарежьте код.Просмотрите небольшой фрагмент кода.

  • Документация : напишите все.

Ответ Даниэля очень помог в исправлении этоговрезаться!

0 голосов
/ 18 февраля 2019

Вывод «Java Result» из Netbeans просто сообщает вам код завершения java-программы.Вы можете создать то же самое с System.exit(-1073740940);.Успешная программа завершается с кодом 0. Все остальное - это сбой, требующий интерпретации документации.

Вы не дали нам никаких указаний относительно того, какую DLL вы используете, поэтому единственная информация, с которой нам нужно работать, этоэтот код выхода.Преобразование этого int в шестнадцатеричные цифры приводит к 0xc0000374, который вы можете ввести в свою любимую поисковую систему и узнать, что это Исключение повреждения кучи .Приведены некоторые примеры, но в целом это означает, что вы обращаетесь к нераспределенной встроенной памяти.

Не имея представления, какой код вы используете, я думаю, вы что-то делаете не так с исходной памятью, вызывая nativeфункции или неправильно манипулируют указателями или дескрипторами где-то в вашем приложении.

Вы должны начать с внимательного изучения аргументов собственных функций.Преобразование типов может быть проблемой, если количество байтов не совпадает.Изучите любые Pointer аргументы для собственных функций, включая ByReference аргументы.Проследите в коде и найдите, когда / как эти указатели были связаны с выделенной памятью.Если оно никогда не было выделено, это одна из возможностей проблемы.Если он был выделен, посмотрите, можете ли вы найти точку, где эта память была освобождена, возможно, с помощью другой встроенной функции.

...