Good luck! Please don't be discouraged if you can't crack this one though, both me and Lionel have looked at Dungeon Keeper (1 and 2) and couldn't figure out why it doesn't work. Lionel has been a Wine hacker for 5+ years now! If you can't get DK to work, or are finding it too frustrating, perhaps move on to another program and see if it's any easier?
Hehe, ok ... but I'm not giving up yet;)
Unhandled vs first chance, hmm, how to explain this. Well in the debugger you can trap *all* exceptions, even if the program itself may in turn catch that exception and deal with it. So it's called a first-chance because you the debugger get the first chance to deal with it. Unhandled just means there was an exception and the program didn't do anything with it, so it falls back to the debugger (in Windows you would see the crash dialog). Notice how the numbers are the same, and the fault (writing to null) is the same.
Ok, I understand.
- How to compile debug information into the 32bit DLL's so I don't get 'No debug information in 32bit DLL' anymore and maybe some better info? I tried 'configure --enable-debug && make depend && make && su -c "make install"' to no avail.
They have debugging info in, but unfortunately there has been breakage in the debugger recently which has not yet been fixed in CVS. This is very bad :( EricP sent a patch here which works great for me and fixed all my debugger problems, try looking in the archives for Jan and December looking for it (it was sent to wine-devel not wine-patches iirc).
For now try setting WINELOADER to the path to your actual wine binary (wine-pthread)
That works.
No, they aren't called, they just happen to be the closest exported symbols the debugger could find. In general the names given to you when there are no debug symbols are useless. Look:
1 0x40501e3d (KERNEL32.DLL.SetThreadExecutionState+0x17fd in KERNEL2.DLL)
see the +0x17fd here? That means the crash occurred in some code a long way from the start of that function, who knows where without debug symbols though.
Ok.
IIRC keeper makes only one or two API calls before crashing, both of those calls are trivial and succeed (setting a timer or something I think) so it's more likely to be to do with the layout of an in memory struct or something. Remember that the TEB is stored in %fs, if you see references to that register.
Yep. It's setting up a timer which in turn creates a thread as far as I understand until now. There's something like a stack overflow going on _maybe_. I've put a backtrace dumping to the start of RTLLeaveCriticalSection which shows more than >1024 stackframes being used near the occurance of the prob - it's showing a re- peating pattern, as does wine --debugmsg +relay,+seh.
Here a little excerpt of the latter: ... ... ... 0013:Ret ntdll.RtlLeaveCriticalSection() retval=00000000 ret=4094afe9 0013:Call ntdll.RtlEnterCriticalSection(403ac6a8) ret=4094ae6f 0013:Ret ntdll.RtlEnterCriticalSection() retval=00000000 ret=4094ae6f 0013:Call ntdll.RtlLeaveCriticalSection(403ac6a8) ret=4094afe9 0013:Ret ntdll.RtlLeaveCriticalSection() retval=00000000 ret=4094afe9 0013:Call ntdll.RtlEnterCriticalSection(403ac6a8) ret=4094ae6f 0013:Ret ntdll.RtlEnterCriticalSection() retval=00000000 ret=4094ae6f 0013:Call ntdll.RtlLeaveCriticalSection(403ac6a8) ret=4094afe9 0013:Ret ntdll.RtlLeaveCriticalSection() retval=00000000 ret=4094afe9 0013:Call ntdll.RtlEnterCriticalSection(403ac6a8) ret=4094ae6f 0013:Ret ntdll.RtlEnterCriticalSection() retval=00000000 ret=4094ae6f 0013:Call ntdll.RtlLeaveCriticalSection(403ac6a8) ret=4094afe9 0013:Ret ntdll.RtlLeaveCriticalSection() retval=00000000 ret=4094afe9 0013:Call ntdll.RtlEnterCriticalSection(403ac6a8) ret=4094ae6f 0013:Ret ntdll.RtlEnterCriticalSection() retval=00000000 ret=4094ae6f 0013:Call ntdll.RtlLeaveCriticalSection(403ac6a8) ret=4094afe9 0013:Ret ntdll.RtlLeaveCriticalSection() retval=00000000 ret=4094afe9 0013:Call ntdll.RtlEnterCriticalSection(403ac6a8) ret=4094ae6f 0013:RUnhandled exception: page fault on write access to 0x00000000 in 32-bit code (0x00406062). In 32-bit mode. 0x00406062 (KEEPER95.EXE..text+0x5062 in KEEPER95.EXE): movb $0x0,0x0(%eax) Wine-dbg>walk thread process tid prio 00000011 (D) C:\Program Files\Bullfrog\Keeper\KEEPER95.EXE 00000013 0 00000012 0 <== 00000008 00000009 0 Wine-dbg>
I've set stack_reserve to 8MB min. That didn't make much of a difference. Unfortunitely I run across a bunch of debugger bugs (I think) following the creation of the timer thread, I decided to put these problems into another post though. I wanted to step to the point where the thread comes alive when the debugger left me at/near a syscall :( I think it has something to do with this thread cause the exception you get is always another depending on what you currently debug ... somehow asynchronous, as the above :)