[Vm-dev] Debugging Win64 Cog Spur

Nicolas Cellier nicolas.cellier.aka.nice at gmail.com
Thu May 25 09:42:04 UTC 2017


2017-05-25 8:28 GMT+02:00 Nicolas Cellier <
nicolas.cellier.aka.nice at gmail.com>:

> Great, you reproduced exact same behavior.
> The problem I have is effectively where to put the breakpoint.
> I think we can believe the output of (gdb) call printCallStack()
>
> I've tried other means:
> - analyze direct usage of registers RCX & co from VMMaker
>   if ever it could conflicts with WIN64 logical register assignment
>   But I did not find anything
> - compile with MSVC 2017
>   if ever the compiler could spit different warnings and give a clue
>   alas it fails very early in readImageFromFileHeapSizeStartingAt (during
> checkAssumedCompactClasses)
>  the failure is incomprehensible, because the debugger shows identical
> contents if I print:
>
>         *((sqInt *)(classTableFirstPage+8+(51<<3)))    140697255509608
> __int64
>         *((sqInt *)(specialObjectsOop+8+(7<<3)))    140697255509608
> __int64
>
> nonetheless, the debugger enters into the if and execute
>         invalidCompactClassError("Array");
>
> I'll have to debug it at assembler level, but it's driving me away from
> the original problem...
>
> and machine code seems wrong:

    /* begin checkAssumedCompactClasses */
    if ((longAt((GIV(specialObjectsOop) + BaseHeaderSize) +
((((usqInt)(ClassArray) << (shiftForWord())))))) !=
00007FF6A0E4FC30  mov         rax,qword ptr [specialObjectsOop
(07FF6A1052EF8h)]
00007FF6A0E4FC37  mov         rcx,qword ptr [classTableFirstPage
(07FF6A1052FB8h)]
00007FF6A0E4FC3E  mov         rcx,qword ptr [rcx]
00007FF6A0E4FC41  cmp         qword ptr [rax+40h],rcx
00007FF6A0E4FC45  je          $l2+282h (07FF6A0E4FC53h)
    /* begin fetchPointer:ofObject: */
    longAt((GIV(classTableFirstPage) + BaseHeaderSize) +
((((usqInt)(ClassArrayCompactIndex) << (shiftForWord())))))) {
        invalidCompactClassError("Array");
00007FF6A0E4FC47  lea         rcx,[string "Array" (07FF6A0F30C14h)]
00007FF6A0E4FC4E  call        invalidCompactClassError (07FF6A0C6FA95h)
    }

I refuse to learn x86 assembler, but it seems that:
- the offset + BaseHeaderSize) + ((((usqInt)(ClassArray) <<
(shiftForWord())))) is OK [rax+40h] is 8+7*8
- the offset BaseHeaderSize) + ((((usqInt)(ClassArrayCompactIndex) <<
(shiftForWord())))) is completely missing!!!
  I would expect 8+51*8=52*8=26*2*8
00007FF6A0E4FC3E  mov         rcx,qword ptr [rcx+1A0h]

At this stage, there's not much I can do with MSVC...


> 2017-05-25 2:38 GMT+02:00 Eliot Miranda <eliot.miranda at gmail.com>:
>
>> Hi Nicolas,
>>
>>     the VM gets quite far before some unknown problem in path name
>> manipulation.  I'm drunning the debug VM under gdb via
>> (gdb) run -trace=259 trunk50-64.image
>> (See Cogit>>sendTrace: for a definition of the flags)
>>
>> and this is the output
>>
>> ...
>> UnixFileDirectory class>pathNameDelimiter
>> Array(Object)>at:
>> BlockClosure>value:
>> AcornFileDirectory class>isActiveDirectoryClass
>> SmalltalkImage>getSystemAttribute:
>> ByteString(String)>isString
>> ByteString(ArrayedCollection)>size
>> ByteString(ArrayedCollection)>size
>> SmallInteger>=
>> Array(Object)>at:
>> BlockClosure>value:
>> MacFileDirectory class>isActiveDirectoryClass
>> MacFileDirectory class>pathNameDelimiter
>> Character>=
>> Array(Object)>at:
>> BlockClosure>value:
>> DosFileDirectory class(FileDirectory class)>isActiveDirectoryClass
>> DosFileDirectory class>pathNameDelimiter
>> DosFileDirectory class(FileDirectory class)>primPathNameDelimiter
>> Character>=
>> FilePath class>pathName:
>> FilePath class>pathName:isEncoded:
>>
>> Alas there's no debug information to be had:
>>
>> (gdb) where
>> #0  0x00000000000008d4 in ?? ()
>> Backtrace stopped: previous frame identical to this frame (corrupt stack?)
>>
>> So my next step is to put a breakpoint for the selector
>> #pathName:isEncoded: and step from there.
>>
>> (gdb) b warning
>> Breakpoint 1 at 0x4015d9: file ../../spur64src/vm/gcc3x-cointerp.c, line
>> 44.
>> (gdb) run -breaksel pathName:isEncoded: trunk50-64.image
>> The program being debugged has been started already.
>> Start it from the beginning? (y or n) y
>> Starting program: /cygdrive/z/oscogvm/build.win6
>> 4x64/squeak.cog.spur/builddbg/vm/Squeak.exe -breaksel
>> pathName:isEncoded: trunk50-64.image
>> [New Thread 4080.0x5ec]
>> [New Thread 4080.0xb30]
>> etc...
>>
>> _,,,^..^,,,_
>> best, Eliot
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/vm-dev/attachments/20170525/1a428287/attachment-0001.html>


More information about the Vm-dev mailing list