PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » PureBasic для Windows » C-Backend, падает программа


C-Backend, падает программа

Сообщений 1 страница 5 из 5

1

Случайно стал падать Launcher, но не всегда, при определённом конфиге. Даже ясно на каких данных в конфиге. Несколько раз с отладчиком выяснил что проблема при создании иконки, код там небольшой, убираешь иконку (путь пустая строка) и иконка не создаётся и всё работает, добавляешь иконку и далее некоторая логика проверки путей. Везде в переменных проверял данные всё норм, но главное не выдаёт строку, просто гуи без кнопок повисит пару секунд и появляется сообщение (обычная мессага) "Ваша программа неожиданно завершила работу". Самое интересное, что на ASM компиляции такой проблемы нет. Подумал да ладно буду собирать её в ASM. Но вчера понадобилось локализовать новый LauncherLV с помощью CodeLocalization и вдруг она падает. Открываю исходник запускаю, чтобы получить ошибку в строке, а он тупо выдал мне мессагу аналогичную предыдущей "Ваша программа неожиданно завершила работу". Смотрю что она в C-Backend, переключаю на ASM и работает. Всё это наталкивает, на какую-то ошибку, которая может выстрелить в любой программе. Пробовал менять .l на .i и обратно, не помогло.
Для теста попробуйте мои исходники Launcher-OWNER запустить в C-Backend, а в CodeLocalization (не перезаливал) открыть исходник LauncherLV, исходник CodeLocalization-Enum+.pb. Если не получите ошибку я скину непосредственно исходник и испытуемый конфиг для точного теста.
Про лаунчер отписал, но ответа не было, надо попробовать собрать какой нибудь сокращённый код. В лаунчере в функции Button_Create() строка 1000 с комментарием "; Назначение значков кнопке" до 1042. Если после запроса из ini-файла переменную сделать пустой BtnIcon$ = "" то код не упадёт. Код падает на относительных путях в конфиге. Не видит путь извлечение должно дать ошибку или пустой hicon, но не упасть. В CodeLocalization вообще нет генерации иконок. Пока не разбирался с CodeLocalization. Так же я ранее компилировал всегда ASM и проблем не видел, а последние исходники часто собираю в C-Backend, и если сразу не пошло, что редко, возвращаю в ASM. Но такой подставы ещё не было, когда работает и вдруг перестало, даже как то переживать стал за свои проги, люди то не всегда пишут о проблемах, не запустилась забросил и всё.

Отредактировано AZJIO (16.03.2026 22:23:42)

0

2

AZJIO написал(а):

Для теста попробуйте мои исходники Launcher-OWNER запустить в C-Backend

Запускается и пишет что нет ini файла.

AZJIO написал(а):

а в CodeLocalization (не перезаливал) открыть исходник LauncherLV

Открылся и приложение не вылетело.
Нужен какой-то код в котором гарантировано приложение вылетает.

0

3

Пётр
У меня Win11x64, PB 6.04 и 6.30 (в описании упомянул это в обоих стабильный сбой на C-Backend), процессор AMD Ryzen 5 8500G OEM.
Failure_C-Backend.7z - полный комплект для теста, добавил описание анализа Launcher-OWNER, как я там исправлял и комментировал чтобы избавиться и что из этого вышло.

0

4

В версии 6.30 Launcher-OWNER вылетает сразу же при запуске в том числе с ассемблерным компилятором. Где-то в коде явно есть ошибка. Вероятно связанная с вызовом WinAPI.
И судя по всему ошибка где-то в процедуре PathFind() потому что при закомментировании ее кода, вылетов нет.
Функция PathFindOnPath() ожидает массив путей, поэтому должно быть

Код:
Structure other_dirs
  *path[2]
EndStructure

Procedure.s PathFind(file$)
	Protected tmp$, tmp2$
	tmp2$ = WorkDir$
	Protected other_dirs.other_dirs
	other_dirs\path[0] = @tmp2$
	other_dirs\path[1] = 0
	tmp$ = Space(#MAX_PATH)
	PokeS(@tmp$, file$)
	If PathFindOnPath_(@tmp$, @other_dirs)
    file$ = tmp$
	EndIf
	ProcedureReturn file$
EndProcedure

Или передать строковой массив в котором последний элемент обязательно будет нулевым что требуется согласно описания функции.

Код:
Procedure.s PathFind(file$)
	Protected tmp$
	Protected Dim other_dirs.s(1)
	other_dirs(0) = WorkDir$
	other_dirs(1) = #Null$
	tmp$ = Space(#MAX_PATH)
	PokeS(@tmp$, file$)
	If PathFindOnPath_(@tmp$, @other_dirs())
    file$ = tmp$
	EndIf
	ProcedureReturn file$
EndProcedure

Кстати, такая манипуляция со строками будет криво работать начиная с версии 6.40, где изменен метод хранения длины строки.

С CodeLocalization все немного сложнее. Вылетает только без отладчика.
В 6.40 beta 2 вылета нет, а значит возможно был баг который исправили.

+1

5

Спасибо, работает.

0


Вы здесь » PureBasic - форум » PureBasic для Windows » C-Backend, падает программа