SASGIS - SAS.Планета
View Issue Details
0002781SAS.Планета[All Projects] Багpublic03-08-2015 19:3604-08-2015 07:29
GunSmoker 
GunSmoker 
normalminorsometimes
resolvedfixed 
Windows8.1x64
141212 
150915150915 
0002781: Access Violation в TDownloadResultError.GetErrorText в юникодной версии
Иногда FErrorTextArgs содержит мусор вместо актуальных данных, что приводит к возбуждению EAccessViolation внутри SysUtils.Format, вызываемой из u_DownloadResult.TDownloadResultError.GetErrorText. При этом AErrorTextArgs для этого экземпляра TDownloadResultError были валидными в момент вызова конструктора.
Не уверен, проявляется редко. Часто всего всё проходит нормально: либо FErrorTextArgs оказывается валиден, либо мусор в FErrorTextArgs успешно читается SysUtils.Format и копируется в Result (в результате чего в Result - мусор, обычно - японско-китайские иероглифы).

В любом случае это исключение где-то гасится и не всплывает до UI.
Пример стека:
:75cb0192 KERNELBASE.RaiseException + 0x49
:0040769c NotifyNonDelphiException + $1C
:77e12bd3 ntdll.RtlRaiseStatus + 0x86
SysUtils.WideFormatBuf(???,???,???,2,(...),$CD9898)
SysUtils.FormatBuf(???,???,???,2,(...),$CD9898)
SysUtils.FmtStr(???,'%s',(...),$CD9898)
SysUtils.Format(???,???,$CD9898)
SysUtils.Format(???,???)
u_DownloadResult.TDownloadResultError.GetErrorText
u_TileRequestResult.TTileRequestResultDownloadError.Create(???)
u_TileDownloaderSimple.TTileDownloaderSimple.Download(TNotifierOneOperationByNotifier($7FC7CC98) as INotifierOneOperation,TNotifierOperation($797FF428) as INotifierOperation,0,TTileRequest($73C69A20) as ITileRequest)
u_TileRequestQueueProcessorThread.TTileRequestQueueProcessorThread.Execute
u_InterfacedThread.TThread4InterfacedThread.Execute
No tags attached.
child of 0002166resolved zed Переход на версию Delphi с полной поддержкой юникода 
png Безымянный.png (172,709) 03-08-2015 19:36
http://www.sasgis.org/mantis/file_download.php?file_id=1916&type=bug
png
Issue History
03-08-2015 19:36GunSmokerNew Issue
03-08-2015 19:36GunSmokerFile Added: Безымянный.png
03-08-2015 19:38GunSmokerNote Added: 0016279
03-08-2015 19:51GunSmokerNote Added: 0016280
03-08-2015 20:00vdemidovNote Added: 0016281
03-08-2015 20:01vdemidovNote Added: 0016282
03-08-2015 20:03vdemidovNote Added: 0016283
03-08-2015 20:04vdemidovSummaryAccess Violation в TDownloadResultError.GetErrorText => Access Violation в TDownloadResultError.GetErrorText в юникодной версии
03-08-2015 20:04GunSmokerRelationship addedrelated to 0002166
03-08-2015 20:06vdemidovRelationship replacedchild of 0002166
03-08-2015 20:06vdemidovStatusnew => confirmed
03-08-2015 20:06vdemidovProduct Version.Nightly => 141212
03-08-2015 20:06vdemidovTarget Version => 150915
03-08-2015 20:19GunSmokerAssigned To => GunSmoker
03-08-2015 20:19GunSmokerStatusconfirmed => assigned
03-08-2015 20:45GunSmokerNote Added: 0016284
03-08-2015 20:50vdemidovNote Added: 0016285
03-08-2015 21:20GunSmokerNote Added: 0016286
03-08-2015 21:23vdemidovNote Added: 0016287
03-08-2015 21:26GunSmokerNote Added: 0016288
03-08-2015 21:32GunSmokerNote Added: 0016290
04-08-2015 07:29vdemidovStatusassigned => resolved
04-08-2015 07:29vdemidovFixed in Version => 150915
04-08-2015 07:29vdemidovResolutionopen => fixed

Notes
(0016279)
GunSmoker   
03-08-2015 19:38   
Зачем там нетривиальное копирование массива вариантов? Не проще ли будет сразу делать Format? Производительность?
(0016280)
GunSmoker   
03-08-2015 19:51   
Ага, причина вылета: в AErrorTextArgs сидит Item.VType = vtUnicodeString, который игнорируется CopyVarRec (вернее, копируется "как есть", без выделения памяти аналогично vtString, vtAnsiString, vtPChar, vtPWideChar и vtWideString). Соответственно, если исходное исключение (сообщение об ошибке) уже было удалено в момент вызова TDownloadResultError.GetErrorText, то указатели из копии FErrorTextArgs указывают в космос. Есть шанс что это сработает, если память от сообщения об ошибке ещё не была перезаписана.
(0016281)
vdemidov   
03-08-2015 20:00   
Это значит, что эта ошибка проявляется только на юникодной версии делфи. Раньше vtUnicodeString вообще не существовало.
(0016282)
vdemidov   
03-08-2015 20:01   
Нужно допиливать CopyVarRec
(0016283)
vdemidov   
03-08-2015 20:03   
Сейчас действительно проще было бы сразу сделать формат. Но не хочется делать форматирование и локализацию строки, которая теоретически вообще не понадобиться. Есть еще хотелки 0001339 и 0001918
(0016284)
GunSmoker   
03-08-2015 20:45   
https://bitbucket.org/sas_team/sas.planet.src/pull-requests/351/fixed-2781-unicodestring/diff
(0016285)
vdemidov   
03-08-2015 20:50   
Ага. Только пользуйся ребейзом и не делай ненужных мержей.
(0016286)
GunSmoker   
03-08-2015 21:20   
Окей, в следующий раз.

А что за клиент вы используете для Windows? Я попробовал TortoiseHG - там есть Merge, а Rebase - только как дополнение.
(0016287)
vdemidov   
03-08-2015 21:23   
TortoiseHG
Rebase именно дополнение, но оно штатное и поддерживается TortoiseHG.
В простейшем варианте просто откат на нужную ревизию, а потом обновление файлов и новый коммит. А старый просто закрываете ветку. Делать новый клон репозитория необязательно. Загляните как Garl делает. Он у нас самый опытный по подготовке пул-реквестов.
(0016288)
GunSmoker   
03-08-2015 21:26   
...а где это посмотреть?

Конкретно сейчас мне проще новый форк сделать, чем разбираться с тем, что я натворил :)
(0016290)
GunSmoker   
03-08-2015 21:32   
https://bitbucket.org/sas_team/sas.planet.src/pull-requests/352/fixed-2781/diff