С чего начинаетя выполнение программы?

Для новичков как вообще в Linux, так и в конкретной теме, к которой относится вопрос.

Модератор: Bizdelnick

MiK13
Сообщения: 1267
ОС: Linux Debian

С чего начинаетя выполнение программы?

Сообщение MiK13 »

Я раньше считал, что первой вызываемой функцией программы является функция int main(int argc, char **argv)
Продолжаю возиться с программой, о которой писал несколько лет назад.
Добавил в начало

Код: Выделить всё

uint32_t DeBug = 0;
extern uint32_t DeBug;
Чтобы управлять печатью в разных модулях, присваивая через параметр разные маски этой переменной.
Но, похоже, делать инициализацию в таком случае нельзя. Хотя g++ ничего об этом не сказал.
Заметил, что программа выдала информацию, хотя я ничего не заказывал. Запустил через gdb.
Выдал watch DeBug и запустил программу. Она тут же остановилась:

Код: Выделить всё

Hardware watchpoint 1: DeBug

Old value = 0
New value = 1434656520
0x00007ffff7b4ad0c in std::basic_ios<char, std::char_traits<char> >::init(std::basic_streambuf<char, std::char_traits<char> >*) ()
   from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
Выдал bt и увидел

Код: Выделить всё

#0  0x00007ffff7b4ad0c in std::basic_ios<char, std::char_traits<char> >::init(std::basic_streambuf<char, std::char_traits<char> >*) ()
   from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#1  0x00007ffff7b473dd in std::basic_ofstream<char, std::char_traits<char> >::basic_ofstream(char const*, std::_Ios_Openmode) ()
   from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#2  0x00005555555fabfc in __static_initialization_and_destruction_0 (__initialize_p=1, __priority=65535) at FreadSaveForDebugging.cpp:13
#3  0x00005555555fac2f in _GLOBAL__sub_I_om () at FreadSaveForDebugging.cpp:33
#4  0x00005555555fcf4d in __libc_csu_init ()
#5  0x00007ffff71bd270 in __libc_start_main (main=0x5555555fb44b <main(int, char**)>, argc=1, argv=0x7fffffffe268, init=0x5555555fcf00 <__libc_csu_init>, 
    fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fffffffe258) at ../csu/libc-start.c:247
#6  0x000055555555d65a in _start ()
строка 13 в FreadSaveForDebugging.cpp -- это
ofstream of_Debugging( "Debugging.txt", om );
После continue программа остановилась ещё раз. Потому, что в начале я поставил

Код: Выделить всё

int main(int argn, char **argv) {
  int id_mv,id_md,id_ms,id_m,l4s;
  printf(" --- DeBug: on %p val=%d(0x%X) ---\n",&DeBug,DeBug,DeBug);
  DeBug=0;
и программа перед остановом напечатала
--- DeBug: on 0x5555558320e0 val=1434656520(0x55831F08) ---
То есть значение было не нулевое.
Но хотелось бы знать, его значение действительно изменил модуль /usr/lib/x86_64-linux-gnu/libstdc++.so.6 или просто в него загрузилось случайное значение? (Похоже, что действительно случайное значение. Но почему компилятор не предупредил?)
И как начинается выполнение программы?
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21288
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: С чего начинаетя выполнение программы?

Сообщение Bizdelnick »

Сначала выполняется инициализация статических (в том числе глобальных) переменных. Если у Вас за логирование отвечает какой-то глобальный объект, то его конструктор запустится раньше main(). Но, честно говоря, я из Вашего описания, не видя кода, ничего не понял, так что ответ может быть мимо кассы.
MiK13 писал:
24.07.2019 01:39
Добавил в начало
В начало чего?
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
MiK13
Сообщения: 1267
ОС: Linux Debian

Re: С чего начинаетя выполнение программы?

Сообщение MiK13 »

Bizdelnick писал:
24.07.2019 09:28
Если у Вас за логирование отвечает какой-то глобальный объект, то его конструктор запустится раньше main().
Что имеется ввиду под "логированием"?
Bizdelnick писал:
24.07.2019 09:28
MiK13 писал:
24.07.2019 01:39
Добавил в начало
В начало чего?
В начала текста модуля с функцией main().
Хотел в разных модулях вставлять отладочную печать, но чтобы она была не слишком интенсивной через параметр задавать, что печатать.

А вообще у меня впечатление, что тут что-то связано с выравниванием.
Сам я делаю все структуры, чтобы в них не было пустых мест, то есть чтобы адреса элементов были кратны размеру элемента.
Автор писал программу на Борланд билдере. Там, похоже, по умолчанию выравнивания нет.
Была основная структура в которой был заголовок в 22 байта и 50 элементов из 4 float. Общая длина -- 822 байта. И ещё имитатор был написан под эту структуру, Поэтому мне пришлось явно добавлять #pragma pack(1)
Долго не мог понять почему после BufferDANN Buf_K = Buf_KMP[і];
меняется адрес Buf_KMP[і] (объявлено vector<BufferDANN> Buf_KMP;)
Объявление

Код: Выделить всё

class BufferDANN {
    int capacity; // Ёмкость буфера
    char* pBuf;   // Указатель на буфер
    int count;    // Число заполненых элементов
Поменял местами объявление count и pBuf -- Buf_KMP[і] перестал меняться.
Подозреваю, что если найду все подобные места, программа будет работать нормально. Как работает когда-то странслированная 32-битная версия,
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21288
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: С чего начинаетя выполнение программы?

Сообщение Bizdelnick »

MiK13 писал:
25.07.2019 02:48
Что имеется ввиду под "логированием"?
Запись лога. Вот этого Вашего Debugging.txt, то бишь.
MiK13 писал:
25.07.2019 02:48
В начала текста модуля с функцией main().
Хотел в разных модулях вставлять отладочную печать, но чтобы она была не слишком интенсивной через параметр задавать, что печатать.
Зачем тогда Вы задали вопрос о функции main(), если речь идёт о глобальной переменной?
MiK13 писал:
25.07.2019 02:48
А вообще у меня впечатление, что тут что-то связано с выравниванием.
Из потока сознания ниже вообще ничего не понял. Причём тут выравнивание?
Показывайте код (как минимум — релевантную часть FreadSaveForDebugging.cpp, от начала и хотя бы до 33 строки), или говорить не о чем.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 3095
ОС: Gentoo

Re: С чего начинаетя выполнение программы?

Сообщение ormorph »

Кто же его знает что там у вас написано.
У меня ваши строчки прошли норм:
Spoiler

Код: Выделить всё

#include <iostream>
uint32_t DeBug = 0;
extern uint32_t DeBug;

int main(int argn, char **argv) {
  int id_mv,id_md,id_ms,id_m,l4s;
  printf(" --- DeBug: on %p val=%d(0x%X) ---\n",&DeBug,DeBug,DeBug);
  DeBug=0;
}
Вывод:

Shell

--- DeBug: on 0x55cb7029604c val=0(0x0) ---
Все норм переменная подхватилась...
Как вы добавляете строчки:

Код: Выделить всё

uint32_t DeBug = 0;
extern uint32_t DeBug;
не знаю.
Но судя по вашему выводу, то переменная DeBug не подхватилась.
Спасибо сказали:
MiK13
Сообщения: 1267
ОС: Linux Debian

Re: С чего начинаетя выполнение программы?

Сообщение MiK13 »

Bizdelnick писал:
25.07.2019 10:31
MiK13 писал:
25.07.2019 02:48
В начала текста модуля с функцией main().
Хотел в разных модулях вставлять отладочную печать, но чтобы она была не слишком интенсивной через параметр задавать, что печатать.
Зачем тогда Вы задали вопрос о функции main(), если речь идёт о глобальной переменной?
\
Я, объявляя эту глобальную переменную, явно указываю, что у неё должно быть нулевое значение.
Но первый исполняемый оператор после int main() (printf) показывает, что значение у неё не нулевое. Причём, меняется от запуска к запуску. Хотя младшие 12 бит этого значения остаются постоянными.
MiK13 писал:
25.07.2019 02:48
А вообще у меня впечатление, что тут что-то связано с выравниванием.
Bizdelnick писал:
25.07.2019 10:31
Из потока сознания ниже вообще ничего не понял. Причём тут выравнивание
Я и сам не знаю. Но, видимо, оно как-то влияет, если при разном выравнивании получается разный результат.
Bizdelnick писал:
25.07.2019 10:31
Показывайте код (как минимум — релевантную часть FreadSaveForDebugging.cpp, от начала и хотя бы до 33 строки), или говорить не о чем.
Вот весь файл FreadSaveForDebugging.cpp:

Код: Выделить всё

//---------------------------------------------------------------------------

////#include <vcl.h>
//#pragma hdrstop

#include "FreadSaveForDebugging.h"

//---------------------------------------------------------------------------

//#pragma package(smart_init)

ios_base::openmode om = ios_base::trunc;
ofstream of_Debugging( "Debugging.txt", om );

bool Pint_Bunch_1            = true;
bool Pint_Identificathion    = true;
bool Pint_LoggerMach_1       = true;
bool Pint_LoggerMach_RegstRO = true;
bool Pint_Classic_KMP        = false;
bool Pint_FildRLS            = true ;
bool Pint_Intensive_KMP      = false;
bool Pint_Simulation_KMP     = true;


// ===================================
void SaveAllInformathion(bool c)    // Сохранить все данные по документированию
{
 Pint_Bunch_1            = c;
 Pint_Identificathion    = c;
 Pint_LoggerMach_1       = c;
 Pint_LoggerMach_RegstRO = c;
 Pint_FildRLS            = c;
}
В файле FreadSaveForDebugging.h только объявление этих переменных как extern. И прототип функции.
Спасибо сказали:
MiK13
Сообщения: 1267
ОС: Linux Debian

Re: С чего начинаетя выполнение программы?

Сообщение MiK13 »

ormorph писал(а):
25.07.2019 12:10
Кто же его знает что там у вас написано.
У меня ваши строчки прошли норм:
Вывод:

Shell

--- DeBug: on 0x55cb7029604c val=0(0x0) ---
Все норм переменная подхватилась...
Как вы добавляете строчки:

Код: Выделить всё

uint32_t DeBug = 0;
extern uint32_t DeBug;
не знаю.
Но судя по вашему выводу, то переменная DeBug не подхватилась.
Эти строчки я добавил сразу после
using namespace std;
Проблема была в том, что когда я запускаю программу через gdb, p DeBug выдаёт 0. Но если я выдаю watch DeBug и запускаю программу, то она останавливается по изменению значения DeBug ещё ДО первого оператора в main(). И изменение происходит в библиотечной функции, которая вызывается из оператора
ofstream of_Debugging( "Debugging.txt", om );

Но меня больше беспокоит другое.

Shell

make 2>2.log
grep -c warning 2.log
175
То есть 175 предупреждений. Я когда-то спрашивал про них у автора программы, но он тогда сказал, что всё нормально, не надо на них обращать внимания. Но, может быть g++ заметно отличается от bc...
Стал смотреть. Некоторые из них действительно не важны.
Например целый ряд типа
warning: enumeration value ‘SelectFilter4’ not handled in switch [-Wswitch] -- В enum перечислено гораздо больше значений, чем case в switch.
Одно долго не мог понять:

Код: Выделить всё

int BASE_LoggerMachine_RLI::FindAdnOccupyFreeNumberTraj(void)
{ //0
  for( unsigned i = 0; i<vecFreeNumberTraj.size(); i++ )
   if( vecFreeNumberTraj[i] == 0 )
     { vecFreeNumberTraj[i] = 1; // Занять свободный номер
       return i; // Вернуть свободный номер
     }
   return -1;
};//0
Оказалось, что у return -1 отступ больше, чем у for. Выравнял -- оно пропало.
В двух местах мне непонятен смысл кода:

Код: Выделить всё

BufferDANN::~BufferDANN(void)
{
 if(pBuf || pBuf != "") delete[] pBuf;
 pBuf     = NULL;  // Укзательна буфер
};
Зачем второе сравнение?
Но несколько типов предупреждений мне непонятны из-за плохого знания C++.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21288
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: С чего начинаетя выполнение программы?

Сообщение Bizdelnick »

Всё равно чего-то не хватает для воспроизведения ошибки:

Shell

% cat main.cpp
#include <inttypes.h>
#include <stdio.h>

uint32_t DeBug = 0;
extern uint32_t DeBug;

int main(int argn, char **argv) {
int id_mv,id_md,id_ms,id_m,l4s;
printf(" --- DeBug: on %p val=%d(0x%X) ---\n",&DeBug,DeBug,DeBug);
DeBug=0;
return 0;
}
% cat FreadSaveForDebugging.cpp
#include <cinttypes>
#include <iostream>
#include <fstream>

extern uint32_t DeBug;

std::ios_base::openmode om = std::ios_base::trunc;
std::ofstream of_Debugging( "Debugging.txt", om );

bool Pint_Bunch_1 = true;
bool Pint_Identificathion = true;
bool Pint_LoggerMach_1 = true;
bool Pint_LoggerMach_RegstRO = true;
bool Pint_Classic_KMP = false;
bool Pint_FildRLS = true ;
bool Pint_Intensive_KMP = false;
bool Pint_Simulation_KMP = true;

void SaveAllInformathion(bool c)
{
Pint_Bunch_1 = c;
Pint_Identificathion = c;
Pint_LoggerMach_1 = c;
Pint_LoggerMach_RegstRO = c;
Pint_FildRLS = c;
}
% g++ main.cpp FreadSaveForDebugging.cpp
% ./a.out
--- DeBug: on 0x561042e95064 val=0(0x0) ---
А у Вас так воспроизведётся?
Добавлено (15:25):
MiK13 писал:
25.07.2019 14:48
Зачем второе сравнение?
Вы про это?
MiK13 писал:
25.07.2019 14:48

Код: Выделить всё

pBuf != ""
Видимо, где-то в коде встречается присваивание

Код: Выделить всё

pBuf = ""
иначе это бессмысленно. Но в любом случае это быдлокод.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 3095
ОС: Gentoo

Re: С чего начинаетя выполнение программы?

Сообщение ormorph »

MiK13 писал:
25.07.2019 14:48
В двух местах мне непонятен смысл кода:

Код: Выделить всё

BufferDANN::~BufferDANN(void)
{
if(pBuf || pBuf != "") delete[] pBuf;
pBuf = NULL; // Укзательна буфер
};

Зачем второе сравнение?
Больше интересно зачем после удаления объекта pBuf присваивать ему значение NULL :)
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3696
ОС: Mandriva => Gentoo (~amd64)

Re: С чего начинаетя выполнение программы?

Сообщение devilr »

ormorph писал(а):
25.07.2019 15:59
Больше интересно зачем после удаления объекта pBuf присваивать ему значение NULL :)
Видимо, ни разу не сталкивались с ситуацией, когда после удаления указатель на объект не становится нулевым. И следующая же проверка считает, что объект есть, когда его уже нет. :)
Эта проблема периодически всплывает (и всплывала) и будет всплывать, видимо. Проще после удаления обнулить указатель, дабы избежать лишней головной боли при отладке.
Если лично вы с этим не сталкивались - это не повод утверждать, что у других этого не может быть.
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 3095
ОС: Gentoo

Re: С чего начинаетя выполнение программы?

Сообщение ormorph »

devilr писал(а):
25.07.2019 16:08
Если лично вы с этим не сталкивались - это не повод утверждать, что у других этого не может быть.
Ну если для отладки, тогда да.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21288
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: С чего начинаетя выполнение программы?

Сообщение Bizdelnick »

devilr писал(а):
25.07.2019 16:08
Видимо, ни разу не сталкивались с ситуацией, когда после удаления указатель на объект не становится нулевым. И следующая же проверка считает, что объект есть, когда его уже нет.
А какая разница, ноль ли в указателе, который, очевидно, является членом удаляемого объекта?
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3696
ОС: Mandriva => Gentoo (~amd64)

Re: С чего начинаетя выполнение программы?

Сообщение devilr »

Bizdelnick писал:
25.07.2019 16:27
А какая разница, ноль ли в указателе, который, очевидно, является членом удаляемого объекта?

Код: Выделить всё

	MyMegaClass *mc = new MyMegaClass();
	...
	delete mc;
	...
	if(mc != null)
		delete mc;
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21288
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: С чего начинаетя выполнение программы?

Сообщение Bizdelnick »

devilr
Bizdelnick писал:
25.07.2019 16:27
А какая разница, ноль ли в указателе, который, очевидно, является членом удаляемого объекта?
Обнуление же происходит в деструкторе.
Впрочем, что-то мы сильно отвлеклись от темы.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3696
ОС: Mandriva => Gentoo (~amd64)

Re: С чего начинаетя выполнение программы?

Сообщение devilr »

Bizdelnick писал:
25.07.2019 16:38
Обнуление же происходит в деструкторе.
Упс. Невнимательно посмотрел. Деструктора то я и не заметил . :)
В данном случае, такое присвоение конечно лишнее.
Просто подобные присваивания указателю null поле удаления объекта периодически встречаются и начинается дискуссия на тему "должен ли компилятор обнулять указатель после удаления объекта".
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
MiK13
Сообщения: 1267
ОС: Linux Debian

Re: С чего начинаетя выполнение программы?

Сообщение MiK13 »

ormorph писал(а):
25.07.2019 15:59
MiK13 писал:
25.07.2019 14:48
В двух местах мне непонятен смысл кода:

Код: Выделить всё

BufferDANN::~BufferDANN(void)
{
if(pBuf || pBuf != "") delete[] pBuf;
pBuf = NULL; // Укзательна буфер
};

Зачем второе сравнение?
Больше интересно зачем после удаления объекта pBuf присваивать ему значение NULL :)
Я о необходимости удаления не думал. Решил, что на всякой случай. Мне непонятно другое.
Если объект существует, то pBuf явно будет не NULL. То есть второй проверки не будет.
Но если первая проверка не прошла, то есть он NULL, то с чем можно его сравнивать?
А компилятор ворчал, что pBuf типа char *, а "" имеет тип string.
Я убрал второе сравнение, но программа всё равно вылетает. Причём, может несколько секунд проработать (данные идут довольно интенсивно). Под gdb вылетает с сообщением

Код: Выделить всё

0x000055555557a68e in std::less<int>::operator() (this=0x555555884144, __x=<error reading variable>, __y=@0x7fffffffce50: 49763) at /usr/include/c++/6/bits/stl_function.h:386
386	      { return __x < __y; }
bt выдаёт 9 точек (от #0 до #8). #8 -- программа с main() C #0 по #4 -- код из файлов /usr/include/c++/6/bits/stl_*.h
Из кода программы она вылетает в следующем цикле (показано его начало)

Код: Выделить всё

  for(unsigned i=0; i<m.size(); i++) {//1
    int N_cell   = Navigatior_KMP.FindNumberCell( m[i].get_R(), m[i].get_B(), m[i].get_E() );
    int n_sektor = FindNumberSektor_For_Cell( N_cell );
    int FIND     = VectSektor[n_sektor].FindNumberCeil( N_cell );
    if( FIND == -1) {                                                                           // нет такой ячейки
      CCell_KMP  CELL ( N_cell, m[i].get_E(), m[i].get_time(), ParKMP.PCell );
      CELL.Add_Measure( &m[i] ); 
      if(DeBug&4) {
        static int nnnnn=0; printf("\n >>> %s:%d nnnnn=%d\n",__FILE__,__LINE__,nnnnn++);
      }
      Map_Cell.insert ( Map_Cell.end(), pair<int, CCell_KMP>(N_cell, CELL) );          // ***** вылетает на этой строке. Но не всегда *****
      VectSektor[n_sektor].AddNumberCeil( N_cell );
    }//2
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21288
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: С чего начинаетя выполнение программы?

Сообщение Bizdelnick »

MiK13 писал:
25.07.2019 17:30
Если объект существует, то pBuf явно будет не NULL. То есть второй проверки не будет.
Но если первая проверка не прошла, то есть он NULL, то с чем можно его сравнивать?
А, ну да. Я почему-то вместо || прочитал &&, а так, как написано, это явная ошибка.
Добавлено (17:41):
MiK13 писал:
25.07.2019 17:30
bt выдаёт 9 точек (от #0 до #8). #8 -- программа с main() C #0 по #4 -- код из файлов /usr/include/c++/6/bits/stl_*.h Из кода программы она вылетает в следующем цикле
Я не понял, какую проблему мы тут обсуждаем? То в переменную что-то не то записалось, то, оказывается, программа вылетает. И вот зачем надо пересказывать своими словами вывод bt, Вы что, считаете, что так понятнее будет?

P. S. Советую собрать код с -fsanitize=address и погонять. Там наверняка немало сюрпризов обнаружится.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
MiK13
Сообщения: 1267
ОС: Linux Debian

Re: С чего начинаетя выполнение программы?

Сообщение MiK13 »

Bizdelnick писал:
25.07.2019 17:35
Я не понял, какую проблему мы тут обсуждаем? То в переменную что-то не то записалось, то, оказывается, программа вылетает.
Основная проблема у меня -- программа вылетает, Но спрашивать "почему?" у незнакомых бессмысленно.
Я начал ставить отладочную печать и обнаружил, что глобальная переменная, которой я присваиваю начальное значение сразу после запуска программы имеет ДРУГОЕ значение. Это у меня в голове не укладывалось. Вот я и решил задать об этом вопрос.
Bizdelnick писал:
25.07.2019 17:35
И вот зачем надо пересказывать своими словами вывод bt, Вы что, считаете, что так понятнее будет?
Да я уже сам не знаю, как будет понятнее
Bizdelnick писал:
25.07.2019 17:35
P. S. Советую собрать код с -fsanitize=address и погонять. Там наверняка немало сюрпризов обнаружится.
Собрал. Программа вылетает, выдаёт
ASAN:DEADLYSIGNAL
=================================================================
==14282==ERROR: AddressSanitizer: SEGV on unknown address 0x15f27fff8c19 (pc 0x562a079268aa bp 0x7ffe3e2304a0 sp 0x7ffe3e230480 T0)
и затем почти тоже самое, что и bt под gdb

Добавил ещё опции -pedantic -std=c++03 -Wshadow -Wcast-align. Компилятор во многих местах поворчал, что после } стоит ; и возмутился на extern uint32_t DeBug;, что неизвестный тип uint32_t. Хотя до этого он ничего про это не говорил.
Пришлось добавить #include <stdint.h>

Наверно, отложу пока возню с этой программой, займусь другой.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21288
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: С чего начинаетя выполнение программы?

Сообщение Bizdelnick »

А этот чудо-разработчик, часом, не напихал туда «для переносимости» заголовочных файлов от своего компилятора/стандартной библиотеки?
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
MiK13
Сообщения: 1267
ОС: Linux Debian

Re: С чего начинаетя выполнение программы?

Сообщение MiK13 »

Bizdelnick писал:
26.07.2019 09:43
А этот чудо-разработчик, часом, не напихал туда «для переносимости» заголовочных файлов от своего компилятора/стандартной библиотеки?
Да как сказать... компилятор там был стандартный, борландовский. Из тех #include, что я "выключал" это io.h и vcl.h. В нескольких файлах пришлось добавить unistd.h И ещё целый рящ "инклюдов" имели расширение .h: vector.h, rmatrix.h, fstream.h, iomanip.h. Может быть какие-то ещё. Я для компиляции g++ просто убирал расширение.

Помню, что был случай, когда он не понимал, почему g++ выдаёт ошибку, хотя bcc транслировал нормально. Потом сел читать какую-то толстую книгу по C++ и через некоторое время сказал "Да, тут надо немного по-другому". Сделали -- g++ принял. Но это было больше 10 лет назад.
Был случай, когда программа вылетала на операции вывода данных в файл через оператор <<. Заменил на fprintf -- стало работать. Правда, строк получилось несколько десятков. Но программа стала работать.
Проблема ещё в том, что он тогда что-то дорабатывал в программе, я дорабатывал наши программы, приходилось корректировать его программу и в результате я сейчас вижу больше десятка вариантов той программы. И компиляторы сейчас немного другие.
И ещё у него нет жёсткого контроля входных данных. Чтобы программа сообщала что-то вроде "не могу больше работать потому что ..."

Пока есть рабочий 32-битной вариант программы, будем его использовать.
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3696
ОС: Mandriva => Gentoo (~amd64)

Re: С чего начинаетя выполнение программы?

Сообщение devilr »

MiK13 писал:
26.07.2019 12:49
Я для компиляции g++ просто убирал расширение.
А это как? Файл foo.h превращался в foo?
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
MiK13
Сообщения: 1267
ОС: Linux Debian

Re: С чего начинаетя выполнение программы?

Сообщение MiK13 »

devilr писал(а):
26.07.2019 13:06
MiK13 писал:
26.07.2019 12:49
Я для компиляции g++ просто убирал расширение.
А это как? Файл foo.h превращался в foo?
В программе были операторы #include файлов fstream.h, iomanip.h, vector.h и другие. Они, как я понимаю, были в составе системы Borland builder. В подкаталогах /usr/include таких файлов не было. Но были с аналогичным именем, но без окончания .h. Я просто в программе в соответствующих строках убрал это окончание. Программа странслировалась.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21288
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: С чего начинаетя выполнение программы?

Сообщение Bizdelnick »

MiK13 писал:
26.07.2019 12:49
компилятор там был стандартный, борландовский.
Он был другой, этого достаточно.
MiK13 писал:
26.07.2019 12:49
Из тех #include, что я "выключал"
Я не о том, что там в include прописано, а о том, не подложены ли эти файлы прямо внутрь проекта вместо того, чтобы браться по стандартным путям.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
MiK13
Сообщения: 1267
ОС: Linux Debian

Re: С чего начинаетя выполнение программы?

Сообщение MiK13 »

Bizdelnick писал:
26.07.2019 13:52
MiK13 писал:
26.07.2019 12:49
Из тех #include, что я "выключал"
Я не о том, что там в include прописано, а о том, не подложены ли эти файлы прямо внутрь проекта вместо того, чтобы браться по стандартным путям.
Не похоже.
В одном из файлов, правда, есть #include "vector.h", в то время, как в четырёх других #include <vector.h>, но самого файла vector.h среди файлов его проекта я не нашёл.
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 3095
ОС: Gentoo

Re: С чего начинаетя выполнение программы?

Сообщение ormorph »

MiK13 писал:
26.07.2019 12:49
Был случай, когда программа вылетала на операции вывода данных в файл через оператор <<. Заменил на fprintf -- стало работать.
Скорее всего через << работает с типом string в то время, как fprintf работает с массивом символов char.
Тут уж кто его знает что делали не так для совместимости.
А так классы могут вести себя по разному как g++ так и bcc.
Как вариант можно еще поиграться со стандартами C++ тыц.
Спасибо сказали: