Skip to content

Для тех, кто коммитит

akruphi edited this page Dec 7, 2024 · 11 revisions

Немного цитат elfmz

  • https://github.com/elfmz/far2l/issues/802#issuecomment-1726311209

    far2l - это проектик для души, а не для гонки. Который хочется чтоб работал стабильно и был удобен, а постоянное внедрение новых фич - это второстепенная задача. Такой вот дауншифт от тенденций софтостроения)

  • https://github.com/elfmz/far2l/issues/2230#issuecomment-2230572396

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

Как, что, где

Note: смотреть CHM в Linux, например, через xCHM (наиболее корректно) или через Okular — просмотр CHM как подряд идущих страниц, но возможны сбои рендеринга текста ссылок и области щелчка по ним.

Отладочные fprintf с выводом логов в терминал или в файл

  • включение вывода логгирования и выбор куда: https://github.com/elfmz/far2l/wiki/Running-far2l-with-debug-logging-enabled

    • в терминале export FAR2L_STD=/path/to/log для лога в файл или export FAR2L_STD=- для лога в stdout терминала, также по необходимости export NETROCKS_VERBOSE=9 и/или export COLORER_VERBOSE=debug и затем в этом же терминале запустить far2l

      • export FAR2L_STD= перенаправление сразу и stdout и stderr (см. SetupStdHandles() в /WinPort/src/Backend/WinPortMain.cpp)
      • export FAR2L_STDOUT= перенаправление отдельно stdout
      • export FAR2L_STDERR= перенаправление отдельно stderr
      • внутри far2l обычно отладочный вывод в stderr
    • отладочный вывод Colorer: https://github.com/elfmz/far2l/pull/2385 (начиная с сентября 2024)

      export FAR2L_STDERR=somefile.log
      export COLORER_VERBOSE=debug # colorer verbose levels: off (default), error, warn or warning, info, debug
      far2l
    • В частности для far2l-GUI я делаю так [нажмите, чтобы развернуть/скрыть]
      • внутри терминала включаю логгирование прямо в этот терминал (а не во внешний файл):
        export FAR2L_STD=-
        export NETROCKS_VERBOSE=9
        export COLORER_VERBOSE=debug
      • в этом же терминале запускаю far2l-GUI
        far2l
      • пока открыт far2l в терминал валятся разные строки информации - удобно, чтобы сразу видеть на какое из действий какие строки лога.
  • отладочная печать в коде: fprintf(stderr, "муа-ха-ха %i", 42); и т.п.

    • шпаргалка по выводу в консоль всего зоопарка строковых типов far2l (спасибо unxed: https://github.com/elfmz/far2l/issues/801 )

      // null-terminated strings (c-strings) made of chars
      // (examples below should also work with LPSTR/LPCSTR/CHAR)
      
      char *sample;
      fprintf(stderr, "%s\n", sample);
      
      char sample[fixed_length_in_bytes_plus_one_for_terminating_zero];
      fprintf(stderr, "%s\n", sample);
      
      // null-terminated strings (c-strings) made of wide chars
      // (examples below should also work with LPWSTR/LPCWSTR/LPTSTR/LPCTSTR/WCHAR/TCHAR)
      
      wchar_t *sample;
      fprintf(stderr, "%ls\n", sample);
      
      wchar_t sample[fixed_length_in_wide_chars_plus_one_for_terminating_zero];
      fprintf(stderr, "%ls\n", sample);
      
      // standard C++ classes for strings
      // for accessing class methods via pointer to object of that class replace "." with "->"
      
      std::string sample;
      fprintf(stderr, "%s\n", sample.c_str());
      
      std::wstring sample;
      fprintf(stderr, "%ls\n", sample.c_str());
      
      // Far internal string class
      
      FARString sample;
      fprintf(stderr, "%s\n", sample.GetMB().c_str());
      fprintf(stderr, "%ls\n", sample.CPtr());
      
      UnicodeString sample;
      fprintf(stderr, "%s\n", sample.GetMB().c_str());
      
      // string classes used in Colorer
      // (examples below should also work with CString and DString classes)
      
      String sample;
      fprintf(stderr, "%ls\n", sample.getWChars());
      
      SString sample;
      fprintf(stderr, "%ls\n", sample.getWChars());
      
      // wxString
      wxString sample;
      fprintf(stderr, "%s\n", sample.ToStdString().c_str());
      //or
      fprintf(stderr, "%s\n", sample.mb_str().data());
      //or
      fprintf(stderr, "%ls\n", static_cast<const wchar_t*>(sample.wc_str()));

      Про wxString: https://docs.wxwidgets.org/3.0/classwx_string.html#string_vararg

Про отладочную информацию через gdb

  • https://github.com/elfmz/far2l/issues/856#issuecomment-742854104

    • запустите графический вариант под дебаггером: gdb far2l и далее
      • run
      • дождитесь падения
      • bt
      • напишите результат сюда
  • https://github.com/elfmz/far2l/issues/557#issuecomment-506029522

    • gdb far2l
    • type run in gdb console -> far2l will be launched
    • repro issue
    • return back to gdb console, hit ctrl+c then type thread apply all bt and send what will be printed out there
  • другие подробности по работе с gdb [нажмите, чтобы развернуть/скрыть]
    • https://github.com/elfmz/far2l/issues/1003#issuecomment-869060945

      откройте терминал, в нем запустите gdb far2l, когда откроется far2l - воспроизведите зависон, когда зависнет - перейдите в терминал с gdb, ткните там Ctrl+C, потом в появившейся ком строке дебаггера напишите thread apply all bt, после чего - полную распечатку результата выложите здесь

    • https://github.com/elfmz/far2l/issues/1257#issuecomment-1044606817

      запустите far2l под gdb - в терминале напишите: gdb far2l после того как gdb раздуплится - напишите в его консоли команду run ... в консоли gdb нажмите Ctrl+C и после того как там появится ком строка - напишите в нее thread apply all bt и результат расшарьте если не жалко

    • https://github.com/elfmz/far2l/issues/1248#issuecomment-1039176746

    запустить far2l под gdb написать в gdb run, спровоцировать крэш, и когда в gdb появится чтото типа поймали SIGSEGV за хвост - то надо там (в gdb) написать команду bt

    • https://github.com/elfmz/far2l/issues/567#issuecomment-510202714

      please run far2l under gdb by executing in terminal:

      gdb far2l

      then type in gdb console:

      run

      After that reproduce issue in opened far2l window, and once far2l hang, switch back to terminal with gdb, then hit Ctrl+C there and type following command:

      thread apply all bt

      ..and report its output

Добавление новых языковых констант для строк сообщений и редактирование помощи

  • Оригинальная инструкция про языковые файлы и файлы помощи см в far 2 encyclopedia или в https://api.farmanager.com/ru/language/

  • Языковые строки задаются в файле far2l/bootstrap/scripts/farlang.templ.m4

    • На текущий момент far2l требует внесения 9 языков: 0-Russian (Русский), 1-English, ... 8-Belarusian (Беларуская) (число языков и порядок задаётся в самом начале файла farlang.templ.m4):

      #number of languages
      9
      #id:0 language file name, language name, language description
      FarRus.lng Russian "Russian (Русский)"
      #id:1 language file name, language name, language description
      FarEng.lng English "English"
      #id:2 language file name, language name, language description
      FarCze.lng Czech "Czech (Čeština)"
      #id:3 language file name, language name, language description
      FarGer.lng German "German (Deutsch)"
      #id:4 language file name, language name, language description
      FarHun.lng Hungarian "Hungarian (Magyar)"
      #id:5 language file name, language name, language description
      FarPol.lng Polish "Polish (Polski)"
      #id:6 language file name, language name, language description
      FarSpa.lng Spanish "Spanish (Español)"
      #id:7 language file name, language name, language description
      FarUkr.lng Ukrainian "Ukrainian (Український)"
      #id:8 language file name, language name, language description
      FarBel.lng Belarusian "Belarusian (Беларуская)"
      
    • В языковом файле формат для каждого сообщения

      Name
      "Текст_на_языке_0"
      "Текст_на_языке_1'
      upd:"Заглушка текста_на_языке_2"
      ...
      "Текст_на_языке_8"
      
    • по имени обращение к ним из кода внутри far2l как Msg::Name (Name - имя сообщения в точности такое же как в языковом файле);

    • все строки в farlang.templ.m4 в двойных кавычках (при использовании кавычек в сообщениях не обязательно ставить обратный слеш и дублировать кавычки; Far Manager, обрабатывая каждую строку из языкового файла, смотрит только на начальную и заключительную кавычки);

    • необходимо добавлять сразу все 9 строк для всех языков (иначе при переключении интерфейса far2l на язык с отсутствующей строкой будет crash и потребуется поиск в какой из констант строки не хатает)!

    • если для какого-то языка перевод не сделан или нет уверенности, что корректен, то помечать префиксом upd:" (для будующих поколений разработчиков) - я обычно сую везде где не знаю английский (строку с нулевыйм языком=Русским помечать upd: нельзя);

    • последней строковой константой всегда должна идти NewFileName, поэтому я добавляю в любое место близко к уже логически похожим строкам (те, что про диалоги настроек - около с диалогами; те, что про в сообщениях редактора - около редактора и т.п.);

    • длина строки - не более 1000 символов;

    • строку нельзя разбивать на подстроки;

    • допускается применение следующих управляющих символов: '\n', '\r', '\', '\b', '\t'.

  • Исходные файлы помощи лежат в far2l/bootstrap/scripts/*.hlf.m4

  • Иногда после изменении исходных файлов локализаций и справки far2l/bootstrap/scripts/*.m4 не перегенерируется соответствующие *.lng или *.hlf, поэтому перед пересборкой на всякий случай в каталогах сборки _build/far2l/bootstrap и _build/install не забываем удалить farlang.templ и все *.lng или *.hlf.