HomeUser Control Panel (unavailable in archive)ForumsTutorialsArt GalleryResourcesMaps

Grimoire Crash Info

03-22-2007, 10:42 PM#1
n13astra
I ran grimiore on my map to help find the trigger causing it to crash. After the crash i had an error log file which contained the following but i dont know how or where to start looking for the bug. Can anyone help?

A copy of the map can be given if needed.

war3err.conf not found

Loading war3err.conf:

bytecodetrace = off

nopause = on

Register natives signature found at: 6f2ab130

symtable offset: 2854

War3_497: 4400c0

SMemAlloc: 15027db0

SStrHashHT: 1503bfa0

NativeStrGet: 6f2b0b30

strget: 6f6a2000

getnativestruct: 6f6a2030

char_to_cache: 6f6b1ca0

cache_to_nstr: 6f6b1c80

OpLimit signature found at: 6f6b85fd

10003986 10003980

DivZero signature found at: 6f6b8669

VarUse signature found at: 6f6b8624

Op signature found at: 6f6b76e5

nativename: Player

hooknative: 100020a0

hooknativedata: 83e58955

nativenameaddr: 6f818a8c

regaddr: 6f2ae0ce

war3_native: 6f2cffa0



nativename: CreateGroup

hooknative: 10001ede

hooknativedata: 83e58955

nativenameaddr: 6f81aa98

regaddr: 6f2ac95e

war3_native: 6f2bc970



nativename: DestroyGroup

hooknative: 10001f08

hooknativedata: 83e58955

nativenameaddr: 6f81aa7c

regaddr: 6f2ac972

war3_native: 6f2bca20



Location: 6f2b0d97

nativename: RemoveLocation

hooknative: 10001d02

hooknativedata: 83e58955

nativenameaddr: 6f81c004

regaddr: 6f2aba9a

war3_native: 6f2b0da0



nativename: ExecuteFunc

hooknative: 100015da

hooknativedata: 83e58955

nativenameaddr: 6f815638

regaddr: 6f2b0356

war3_native: 6f2e2280



Pause patch signature found at: 6f0f5799

game.dll patched successfully

Waited for 0 before letting RegisterNatives run
03-22-2007, 10:45 PM#2
Vexorian
That's nto a crash log.

check bytecode.log and make sure war3err.dll is loaded


---

You are missing war3err.conf, make it look like this:
war3err.conf:
bytecodetrace = on
nopause = off

Then run the map again, make it crash, bytecode.txt will contain the last function called. Also make sure you have the correct logd.exe
03-24-2007, 12:43 PM#3
n13astra
Ok got something but it a little long. How do i read it to get useful information for debugging the code?

jN :: 0 0 46 0x14:setreg 0
jN :: 45 46 46 0x20:add 0
jN :: 0 0 46 0x11:setvar 92:i
jN :: 0 0 0 0x28:jump dest 3134
jN :: 0 0 0 0x2b:unknown 3111
jN :: 0 4:integer 7 0xe:getvar 8508:jQ
jN :: 0 0 7 0x13:push 0
jN :: 0 4:integer 8 0xc:literal 0
jN :: 0 0 9 0x14:setreg 0
jN :: 8 9 9 0x1b:unknown 0
jN :: 0 0 9 0x29:jump if true 3112
jN :: 0 4:integer 47 0xe:getvar 8508:jQ
jN :: 0 0 47 0x13:push 0
jN :: 0 0 0 0x15:callnative 916:GetSpellTargetUnit
jN :: 0 0 0 0x13:push 0
jN :: 0 0 0 0x16:callfunc 2817:UnitAddItemByIdSwapped
UnitAddItemByIdSwapped :: 0 2 4:integer 0x8:pop 1023:itemId
UnitAddItemByIdSwapped :: 0 1 7:handle 0x8:pop 1113:whichHero
UnitAddItemByIdSwapped :: 0 4:integer 66 0xe:getvar 1023:itemId
UnitAddItemByIdSwapped :: 0 0 66 0x13:push 0
UnitAddItemByIdSwapped :: 0 7:handle 67 0xe:getvar 1113:whichHero
UnitAddItemByIdSwapped :: 0 0 67 0x13:push 0
UnitAddItemByIdSwapped :: 0 0 0 0x15:callnative 1180:GetUnitX
UnitAddItemByIdSwapped :: 0 0 0 0x13:push 0
UnitAddItemByIdSwapped :: 0 7:handle 68 0xe:getvar 1113:whichHero
UnitAddItemByIdSwapped :: 0 0 68 0x13:push 0
UnitAddItemByIdSwapped :: 0 0 0 0x15:callnative 1181:GetUnitY
UnitAddItemByIdSwapped :: 0 0 0 0x13:push 0
UnitAddItemByIdSwapped :: 0 0 0 0x15:callnative 999:CreateItem
UnitAddItemByIdSwapped :: 0 0 0 0x11:setvar 2460:bj_lastCreatedItem
UnitAddItemByIdSwapped :: 0 7:handle 69 0xe:getvar 1113:whichHero
UnitAddItemByIdSwapped :: 0 0 69 0x13:push 0
UnitAddItemByIdSwapped :: 0 7:handle 70 0xe:getvar 2460:bj_lastCreatedItem
UnitAddItemByIdSwapped :: 0 0 70 0x13:push 0
UnitAddItemByIdSwapped :: 0 0 0 0x15:callnative 1163:UnitAddItem


The code i THINK that it crashed on.

Collapse JASS:
function Trig_Tower_Modules_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'A036'
endfunction

function Trig_Tower_Modules_Actions takes nothing returns nothing
    local integer array ModuleWeapon
    local integer array ModuleRadar
    local integer array ModuleTroop
    local integer array ModuleHeal
    local integer array ModuleHP
    local integer i
    local integer Slot
    local integer Module
    local integer SkillLevel = GetUnitAbilityLevel(GetTriggerUnit(), 'A036')
    local boolean TargetHasModuleWeapon = false
        local boolean TargetHasModuleRadar = false
    local boolean TargetHasModuleTroop = false
    local boolean TargetHasModuleHeal = false
    local boolean TargetHasModuleHP = false
    local boolean ValidModule = false
    if UnitInventoryCount(GetSpellTargetUnit()) != 6 and GetUnitAbilityLevel(GetSpellTargetUnit(), 'A03P') == 1 then
        set ModuleWeapon[1] = 'I03R'
        set ModuleWeapon[2] = 'I044'
        set ModuleWeapon[3] = 'I045'
        set ModuleWeapon[4] = 'I046'
        set ModuleWeapon[5] = 'I047'
                set ModuleRadar[1] = 'I04F'
        set ModuleRadar[2] = 'I04G'
        set ModuleRadar[3] = 'I04H'
        set ModuleRadar[4] = 'I04I'
        set ModuleRadar[5] = 'I04J'
        set ModuleTroop[1] = 'I03Q'
        set ModuleTroop[2] = 'I040'
        set ModuleTroop[3] = 'I041'
        set ModuleTroop[4] = 'I042'
        set ModuleTroop[5] = 'I043'
        set ModuleHeal[1] = 'I03Y'
        set ModuleHeal[2] = 'I03Z'
        set ModuleHeal[3] = 'I03P'
        set ModuleHeal[4] = 'I03W'
        set ModuleHeal[5] = 'I03X'
        set ModuleHP[1] = 'I03V'
        set ModuleHP[2] = 'I03U'
        set ModuleHP[3] = 'I03T'
        set ModuleHP[4] = 'I03S'
        set ModuleHP[5] = 'I03O'

        set Slot = 1
        loop
            exitwhen Slot > 6
            set Module = GetItemTypeId(UnitItemInSlotBJ(GetSpellTargetUnit(), Slot))
            set i = 1
            loop
                exitwhen i > 5
                if Module == ModuleWeapon[i] then
                    set TargetHasModuleWeapon = true
                endif
                if Module == ModuleTroop[i] then
                    set TargetHasModuleTroop = true
                endif
                if Module == ModuleHeal[i] then
                    set TargetHasModuleHeal = true
                endif
                if Module == ModuleHP[i] then
                    set TargetHasModuleHP = true
                endif
                                if Module == ModuleRadar[i] then
                    set TargetHasModuleRadar = true
                endif
                set i = i + 1
            endloop
            set Slot = Slot + 1
        endloop

        if not (TargetHasModuleWeapon and TargetHasModuleTroop and TargetHasModuleHeal and TargetHasModuleHP and TargetHasModuleRadar) then
            set Module = 0
            set i = GetRandomInt(1, 5)
            loop
                exitwhen Module != 0
                if i == 1 and not TargetHasModuleWeapon then
                    set Module = ModuleWeapon[SkillLevel]
                endif
                if i == 2 and not TargetHasModuleTroop then
                    set Module = ModuleTroop[SkillLevel]
                endif
                if i == 3 and not TargetHasModuleHeal then
                    set Module = ModuleHeal[SkillLevel]
                endif
                if i == 4 and not TargetHasModuleHP then
                    set Module = ModuleHP[SkillLevel]
                endif
                                if i == 5 and not TargetHasModuleRadar then
                    set Module = ModuleRadar[SkillLevel]
                endif
                if i == 5 then
                    set i = 1
                else
                    set i = i + 1
                endif
            endloop
            call UnitAddItemByIdSwapped( Module, GetSpellTargetUnit() )
        else
            call IssueImmediateOrder( GetTriggerUnit(), "stop" )
            call DisplayTextToForce( GetForceOfPlayer(GetOwningPlayer(GetTriggerUnit())), "|cfffed312The target has already modules of all types.|r" )
            call TriggerSleepAction ( 0 )
            call SetUnitManaBJ( GetTriggerUnit(), ( GetUnitStateSwap(UNIT_STATE_MANA, GetTriggerUnit()) + I2R(5 * SkillLevel)) )
        endif
    else
        call IssueImmediateOrder( GetTriggerUnit(), "stop" )
        call DisplayTextToForce( GetForceOfPlayer(GetOwningPlayer(GetTriggerUnit())), "|cfffed312The target has to have an empty inventory slot.|r" )
        call TriggerSleepAction ( 0 )
        call SetUnitManaBJ( GetTriggerUnit(), ( GetUnitStateSwap(UNIT_STATE_MANA, GetTriggerUnit()) + I2R(5 * SkillLevel) ) )
    endif
endfunction

//===========================================================================
function InitTrig_Tower_Modules takes nothing returns nothing
    set gg_trg_Tower_Modules = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Tower_Modules, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_Tower_Modules, Condition( function Trig_Tower_Modules_Conditions ) )
    call TriggerAddAction( gg_trg_Tower_Modules, function Trig_Tower_Modules_Actions )
endfunction
03-24-2007, 11:40 PM#4
wyrmlord
From the look at the bottom of the bytecode, my guess is that it crashed when calling the UnitAddItemByIdSwapped function. I think that would be obvious enough as the last lines of code contain the text: "UnitAddItemByIdSwapped". Try commenting out that function where found and see if the code will run without crashing.

By the way, did you really need to paste the entire file's contents into a thread? You could have attached a file.
03-24-2007, 11:49 PM#5
n13astra
Yeah i figured as much but does it tell me if one of the variables passed into that function are pointing to null or 0?

Yeah sorry bout that.
03-26-2007, 01:59 AM#6
PipeDream
Unfortunately grimoire does not watch variable contents. You can add debug messages now, though.