Форум программистов, компьютерный форум, киберфорум
С++ под Linux
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/21: Рейтинг темы: голосов - 21, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 03.02.2021
Сообщений: 5
1

Как поймать segmentation fault в блоках try catch в linux

24.05.2021, 14:24. Показов 3867. Ответов 13
Метки нет (Все метки)

Доброго времени суток. Недавно в голову пришла идея сделать прогу, которая бы отображала некоторые участки своей памяти в консоль в виде hex текста.
Столкнулся с такой проблемой : почему-то в этом блоке кода :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
std::string ERRORSTR = "\x1B[31mER\x1B[0m"; 
 
template< typename T >
std::string int_to_hex( T i )
{
  std::stringstream stream;
  stream 
         << std::setfill ('0') << std::setw(2) 
         << std::hex << i;
  return stream.str();
}
 
std::string GetHex (byte *ptr)
{
int i;
try
{
i = static_cast<int> (*ptr);
return int_to_hex (i);
}
 
catch (int a)
{
return ERRORSTR;
}
}
в catch никакого отлова исключения не происходит, и прога вылетает. Мне же надо, чтобы после неудачи чтения данных с указателя она просто вернула специальную строку, оповещающую об ошибке чтения, и продолжила работу. p.s - моя ос : linux с последним lts ядром
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.05.2021, 14:24
Ответы с готовыми решениями:

Segmentation fault
Здраствуйте. На днях установил Kubuntu, сейчас пробую установить Qt. Скачал с их сайта...

Segmentation fault
Есть бот в телеграмме. При очень большой нагрузке скрипт перестает работать и выдает ошибку...

Segmentation fault
Почему при таком варианте происходит Segmentation fault? vec3f trace(const Scene&amp; scene, const...

Segmentation fault
&quot;Segmentation fault&quot; из-за чего может вылетать?

13
83 / 60 / 25
Регистрация: 26.04.2021
Сообщений: 240
24.05.2021, 14:35 2
Я не спец в C++, но разве в C++ есть обработчик сигнала нарушения сегментации по умолчанию? Впервые такое слышу
0
фрилансер
2529 / 1943 / 478
Регистрация: 11.10.2019
Сообщений: 5,672
24.05.2021, 14:40 3
UtoECat, в целом - достаточно проверять ptr на nullptr. А то, что передан указатель на кривую память - это вопрос к программисту. Нужно исправлять ошибку, а не позволять программе работать дальше
0
83 / 60 / 25
Регистрация: 26.04.2021
Сообщений: 240
24.05.2021, 14:49 4
Лучший ответ Сообщение было отмечено UtoECat как решение

Решение

Я не нашел подтверждения тому, что в C++ есть обработчик сигнала нарушения сегментации памяти по умолчанию, который еще и исключение кидает, так что обработка происходит вероятно так же как и в C
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#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;
}
Нашел еще вот такую древнюю либу https://github.com/Plaristote/segvcatch, которая делает именно то что вы хотите судя по описанию
1
0 / 0 / 0
Регистрация: 03.02.2021
Сообщений: 5
24.05.2021, 15:28  [ТС] 5
Цитата Сообщение от Алексей1153 Посмотреть сообщение
А то, что передан указатель на кривую память - это вопрос к программисту. Нужно исправлять ошибку, а не позволять программе работать дальше
Алексей1153, я же говорю, что в этом и задумка - программа будет перебирать указатель с определённого по определённый, читая значение условной char переменной по нему, и в этом пространстве может быть недоступное для программы, где будут генерироваться исключения, которые мне в данном контексте необходимо игнорировать.
0
фрилансер
2529 / 1943 / 478
Регистрация: 11.10.2019
Сообщений: 5,672
24.05.2021, 15:34 6
UtoECat, мне не удалось поймать ошибочный доступ. На [2] и [3] должно отваливаться, но, видимо, память там принадлежит процессу. А на [100000] процесс падает, ничего не ловится

https://onlinegdb.com/guRTbjnA-
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
int main()
{
    int* ptr=new int[2];
    try
    {
        ptr[0]=0;
        ptr[1]=0;
        std::cout<<"trying"<<'\n';
        ptr[2]=0;
        ptr[3]=0;
        std::cout<<"o_O"<<'\n';
        ptr[100000]=0;
        std::cout<<"x_x"<<'\n';
    }
    catch(std::exception& e)
    {
        std::cout<<"caught1"<<'\n';
    }
    catch(...)
    {
        std::cout<<"caught2"<<'\n';
    }
}
trying
o_O
Segmentation fault (core dumped)
0
14697 / 7863 / 1886
Регистрация: 30.01.2014
Сообщений: 13,282
25.05.2021, 13:11 7
Алексей1153, потому что исключения с++ для этого не предназначены.
0
фрилансер
2529 / 1943 / 478
Регистрация: 11.10.2019
Сообщений: 5,672
25.05.2021, 13:14 8
DrOffset, ну я об этом примерно и написал мысль выше - что нужно баг исправлять, а не ловить последствия
0
14697 / 7863 / 1886
Регистрация: 30.01.2014
Сообщений: 13,282
25.05.2021, 13:17 9
Алексей1153, я понимаю, я к тому, что можно было и не писать специальный пример, это и так прописная истина.
0
фрилансер
2529 / 1943 / 478
Регистрация: 11.10.2019
Сообщений: 5,672
25.05.2021, 13:18 10
DrOffset, примеры лучше запоминаются
0
14697 / 7863 / 1886
Регистрация: 30.01.2014
Сообщений: 13,282
25.05.2021, 13:24 11
оставлю здесь: Не работает перехват исключений try catch в GCC
0
0 / 0 / 0
Регистрация: 03.02.2021
Сообщений: 5
12.06.2021, 08:50  [ТС] 12

Не по теме:

извиняюсь за небольшой некропостинг

, но я нашёл способ как обработать segfault, при этом продолжив выполнение программы работает на тех же сигналах.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include<stdio.h>
#define __USE_GNU
#include<signal.h>
#include<ucontext.h>
 
void myhandle(int mysignal, siginfo_t *si, void* arg)
{
  printf("\033[1;31mERROR  >> Signal is %d %s ",mysignal,": Segmentation Fault\033[0m\n");
  ucontext_t *context = (ucontext_t *)arg;
   printf("\033[1;34mFIXING >> Move adress from %p\033[0m\n",
context->uc_mcontext.gregs[REG_RIP]);
  context->uc_mcontext.gregs[REG_RIP] = context->uc_mcontext.gregs[REG_RIP] + 0x02 ; //P.S : Если вылетит ошибка : неправильная инструкция, то поставьте не 0x02, а 0x04
}
 
int main(int argc, char *argv[])
{
  struct sigaction action;
  action.sa_sigaction = &myhandle;
  action.sa_flags = SA_SIGINFO;
  sigaction(11,&action,NULL);
  printf("Trying to make a segfault...\n");
 
  int *a=NULL;
  int b;
  b =*a; // Get value from zero pointer
 
  printf("I am alive\n");
 
  int *d=0x55;
  int c;
  c =*d; // Get value from invalid adress
 
  printf("I am still alive. You can't kill me :D\n");
  chech
  printf("Ok... I 'm done...\n");
 
  return 0;
}
Вывод :
Кликните здесь для просмотра всего текста
Trying to make a segfault...
ERROR >> Signal is 11 : Segmentation Fault
FIXING >> Move adress from 0x55f8b2490250
I am alive
ERROR >> Signal is 11 : Segmentation Fault
FIXING >> Move adress from 0x55f8b2490276
I am still alive. You can't kill me
Ok... I 'm done...

И.. Да. Я в курсе того, к чему это может привести. Но в моей задаче без этого не обойтись. Так как выделеная память процессу так или иначе периодически обрывается
Кликните здесь для просмотра всего текста

55d8738f8000-55d8738f9000 r--p 00000000 08:04 1719739 /usr/bin/xed
55d8738f9000-55d8738fa000 r-xp 00001000 08:04 1719739 /usr/bin/xed
55d8738fa000-55d8738fb000 r--p 00002000 08:04 1719739 /usr/bin/xed
55d8738fb000-55d8738fc000 r--p 00002000 08:04 1719739 /usr/bin/xed
55d8738fc000-55d8738fd000 rw-p 00003000 08:04 1719739 /usr/bin/xed // как тут
55d8758cd000-55d8770f5000 rw-p 00000000 00:00 0 [heap] //или тут вообще
7f8208000000-7f820804b000 rw-p 00000000 00:00 0
7f820804b000-7f820c000000 ---p 00000000 00:00 0
7f820fb80000-7f820fffd000 rw-s 00000000 00:01 2037 /memfd:gdk-wayland (deleted)

А моя программа должна будет полностью всё это прочитать и вывести в hex формате

P.S : и я прошу прощения, что приравнивал к try catch задачу отловли segfault. Просто сам недавно с delphi перелез
0
14697 / 7863 / 1886
Регистрация: 30.01.2014
Сообщений: 13,282
12.06.2021, 13:26 13
Цитата Сообщение от UtoECat Посмотреть сообщение
А моя программа должна будет полностью всё это прочитать и вывести в hex формате
Вам надо прочитать всю доступную память процесса?
0
0 / 0 / 0
Регистрация: 03.02.2021
Сообщений: 5
13.06.2021, 19:59  [ТС] 14
Цитата Сообщение от DrOffset Посмотреть сообщение
Вам надо прочитать всю доступную память процесса?
DrOffset, ну что-то в этом роде... Я вообще хочу сделать Hex редактор памяти процесса из терминала в реалтайме , чтобы более обширнее взглянуть на то, что под капотом, но пока хотя-бы в файл вывести... И кста, я узнал, что следует всю инфу об блоках памяти, принадлежащих процессу, получить в /proc/self/maps, но всё же... Да и меня всё равно интересовала возможность так выкрутится из segfault ЧИСТО ДЛЯ ИНТЕРЕСА. Разумеется, пихать такое нельзя ни в один проект как решение проблемы с ошибочным доступом к памяти.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.06.2021, 19:59

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Segmentation fault
Помогите найти плз ошибку(и), из-за которой происходит ошибка сегментации Само задание: дана...

Segmentation fault
хочу выполнить это, но выходит ошибка segmentation fault программка учебная. она ничего не...

Segmentation fault
Добрый день! У меня следующая проблема: Есть функция real *Interpolate(real **tab, real rr),...

segmentation fault
При компиляции выдает segmentation fault, подскажите, как исправить. #include &lt;iostream&gt;...

Segmentation fault
Доброго времени суток. Есть 2 класса. object class object{ void (*f)(object*); public:...

Segmentation fault
Всем привет, написал программу с массивами. В конце надо было дописать цикл для сортировки...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.