Re: Asynchronous structured exception handling (SEH) in TortoiseProc (/EHa)

Ivan Zhakov <[email protected]>
Newsgroups gmane.comp.version-control.subversion.tortoisesvn.devel
Message-ID <CABw-3Yf=Mi2apb4RLHwNB=Nz-4yGxG4eOwj9MGpJGRvX+8nj5w@mail.gmail.com>
On 19 February 2016 at 20:48, Stefan Kueng <[email protected]> wrote:
> On 19.02.2016 14:20, Ivan Zhakov wrote:
>>
>> On 17 February 2016 at 21:59, Stefan Küng <[email protected]> wrote:
>>>
>>> On 17.02.2016 11:57, Ivan Zhakov wrote:
>>>>
>>>> I'm currently investigating crashes in TortoiseProc like the one in
>>>> drdump problem 175614 [1].
>>>>
>>>> In all cases the stacktrace looks like this:
>>>> [[[
>>>>>
>>>>>      libapr_tsvn.dll!apr_pool_destroy(apr_pool_t * pool) Line 814    C
>>>>
>>>>        libapr_tsvn.dll!apr_pool_destroy(apr_pool_t * pool) Line 811    C
>>>>        [...]
>>>>        libapr_tsvn.dll!apr_pool_destroy(apr_pool_t * pool) Line 811    C
>>>>        VCRUNTIME140.dll!_CallSettingFrame() Line 50    Unknown
>>>>        VCRUNTIME140.dll!__FrameUnwindToState() Line 1094    C++
>>>>        VCRUNTIME140.dll!__InternalCxxFrameHandler() Line 393    C++
>>>>        VCRUNTIME140.dll!__CxxFrameHandler3() Line 215    C++
>>>>        ntdll.dll!RtlpExecuteHandlerForUnwind ()    Unknown
>>>>        ntdll.dll!RtlUnwindEx()    Unknown
>>>>        ntdll.dll!__C_specific_handler ()    Unknown
>>>>        ntdll.dll!RtlpExecuteHandlerForException ()    Unknown
>>>>        ntdll.dll!RtlDispatchException()    Unknown
>>>>        ntdll.dll!KiUserExceptionDispatch ()    Unknown
>>>>        libapr_tsvn.dll!allocator_alloc(apr_allocator_t * allocator,
>>>> unsigned __int64 in_size) Line 333    C
>>>>        libsvn_tsvn.dll!serf_bucket_mem_alloc() Line 216    C
>>>>        libsvn_tsvn.dll!serf_bucket_headers_setx() Line 103    C
>>>>        [...]
>>>>        libsvn_tsvn.dll!svn_client_update4() Line 722    C
>>>>        TortoiseProc.exe!SVN::Update() Line 404    C++
>>>> ]]]]
>>>>
[...]
>>> We use catch(...) in some places, that's why /EHa is enabled.
>>> Yes, it can be dangerous. But especially with the log cache it's better
>>> to catch the exception and then remove the corrupted cache than to crash
>>> over and over.
>>
>> Well, I see: that current log cache uses direct access to memory
>> mapped file with bounds checking etc. I could review the code and add
>> necessary checks to convert Access Violation errors to normal C++
>> exceptions, but I wonder why TortoiseSVN uses custom disk storage for
>> log caches instead of something like SQLite? Subversion libraries
>> expose nice API for working with sqlite databases.
>
>
> the log cache is optimized for speed. For example, you can show the log for
> the whole KDE or Apache repository (including all subproject). Then show the
> log again and you get *all* entries within about two/three seconds.
> But for more details, you have to ask Stefan Fuhrmann ;)

SQLite is very performant when there's little concurrency (as it is
with the log caching). I wonder, what was the reason of not using it
for this purpose and re-implementing everything manually.

>
>>> Also, for the shell extension using catch(...) is the only way to
>>> prevent the desktop process from crashing - too many buggy extensions
>>> are out there which can interfere with TSVN, and it's always TSVN that
>>> gets the blame...
>>
>> I'm currently focused on TortoiseProc (and maybe TSVNCache). I
>> understand that shell extension may require different handling and we
>> should try everything to avoid crashing explorer.exe.
>
>
> Yes. At least for all the status-fetching code.
>
Btw we started to convert some abort() calls in status-fetching code
to normal errors in Subversion.

>> I may suggest the following:
>> 1. I'll disable asynchronous SEH exception handling in TortoiseProc.exe
>> 2. I'll start reviewing/rewriting log cache storage not to crash in
>> case of corrupted database
>> 3. We backport change (1) to 1.9.x.  After that I'll investigate
>> drdump crashes related to the log cache storage and convert them to
>> C++ exceptions.
>>
>> How does it sound?
>
>
> That sounds good. If you have the time to do it, then please go ahead!
>

It took a little bit longer than I expected but as of r27210 log cache
should gracefully handle most common database corruptions. There are
still some cases when TortoiseSVN trunk will crash with a corrupted
log cache, but TortoiseSVN 1.9.3 may also crash in these cases. I'm
going to fix these edge cases later.

I disabled asynchronous structured exception handling (SEH) in
TortoiseProc in r27211.

What do you think about backporting these changes to 1.9.x? Changes
are not small, but they fix real crashes.

-- 
Ivan Zhakov

------------------------------------------------------
http://tortoisesvn.tigris.org/ds/viewMessage.do?dsForumId=757&dsMessageId=3162819

To unsubscribe from this discussion, e-mail: [[email protected]].
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.