Как отловить ошибку сегментации в Linux?

Кажется, что новая версия (1.2.0) недоступна для загрузки на сайте http://www.achartengine.org/ . и поэтому метод gradle / maven не работает (или файл моментального снимка был удален). Мне удалось использовать и добавить его в мой проект, загрузив файл jar отсюда: https://github.com/ddanny/achartengine/files/460139/achartengine-1.2.0.zip

66
задан Hunsu 20 September 2014 в 16:13
поделиться

2 ответа

В Linux они тоже могут быть исключениями.

Обычно, когда ваша программа выполняет ошибку сегментации, ей посылается сигнал SIGSEGV . Вы можете настроить свой собственный обработчик для этого сигнала и смягчить последствия. Конечно, вы действительно должны быть уверены, что сможете оправиться от ситуации. В вашем случае, я думаю, вам следует вместо этого отладить свой код.

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

try
{
    *(int*) 0 = 0;
}
catch (std::exception& e)
{
    std::cerr << "Exception caught : " << e.what() << std::endl;
}

Но не проверял. Работает на моем компьютере с Gentoo x86-64. Он имеет платформенно-зависимый бэкэнд (заимствованный из java-реализации gcc), поэтому он может работать на многих платформах. Он просто поддерживает x86 и x86-64 из коробки, но вы можете получить бэкэнд из libjava, который находится в исходных кодах gcc.

65
ответ дан 24 November 2019 в 14:39
поделиться

Вот пример того, как это сделать в C.

#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void segfault_sigaction(int signal, siginfo_t *si, void *arg)
{
    printf("Caught segfault at address %p\n", si->si_addr);
    exit(0);
}

int main(void)
{
    int *foo = NULL;
    struct sigaction sa;

    memset(&sa, 0, sizeof(struct sigaction));
    sigemptyset(&sa.sa_mask);
    sa.sa_sigaction = segfault_sigaction;
    sa.sa_flags   = SA_SIGINFO;

    sigaction(SIGSEGV, &sa, NULL);

    /* Cause a seg fault */
    *foo = 1;

    return 0;
}
35
ответ дан 24 November 2019 в 14:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: