Debugging script crashes? (exception access violation)

I’m getting crashes in 2.80 and 2.81 from a script (well, addon) for exporting assets using .fbx. The operator that exports a single selected asset works fine but the one that wraps that process in a for loop for a collection crashes ( EXCEPTION_ACCESS_VIOLATION 0x00007FF6FCDBC72A)

Is there a way to debug this to see where in the script crashes? I’ve got a source build and VS on Windows.

This could happen if you are storing a reference to an object in that loop instead of a copy of it. But we can only know for sure if you share the code :wink:

That script wasn’t really important but I’ve got another one that works in 2.79 but causes crashes in 2.80 (just changed the version number). Not very pretty since I wrote it a long time ago but anyway, would be nice if the reason for the crash could be found.

#
# Save into your addons directory as mesh_set_vertex_color.py
# and activate the add-on in user preferences
#

bl_info = {
    "name" : "Set Vertex Color",
    "author" : "Stanislav Blinov, edited by Henrik Berglund",
    "version" : (1, 1, 0),
    "blender" : (2, 80, 0),
    "description" : "Set vertex color for selected vertices",
    "category" : "Mesh",}

import bmesh
import bpy
from mathutils import Vector, Color


class MESH_xOT_SetVertexColor(bpy.types.Operator):
    bl_idname = "mesh.addon_set_vertex_color"
    bl_label = "Set Vertex Color..."
    bl_options = {'REGISTER', 'UNDO'}

    #R = bpy.props.FloatVectorProperty(subtype='COLOR', default=[1.0, 0.0, 0.0])
    #G = bpy.props.FloatVectorProperty(subtype='COLOR', default=[0.0, 1.0, 0.0])
    #B = bpy.props.FloatVectorProperty(subtype='COLOR', default=[0.0, 0.0, 1.0])
    #yellow = bpy.props.FloatVectorProperty(subtype='COLOR', default=[1.0, 1.0, 0.0])
    #magenta = bpy.props.FloatVectorProperty(subtype='COLOR', default=[1.0, 0.0, 1.0])
    #teal = bpy.props.FloatVectorProperty(subtype='COLOR', default=[0.0, 1.0, 1.0])

    #easingItems = [
    #("EASE_IN", "Ease In", "", "", 0),
    #("EASE_OUT", "Ease Out", "", "", 1),
    #("EASE_IN_OUT", "Ease In-Out", "", "", 2)]

    # prop defined in the addon/node class
    #easingType = bpy.props.EnumProperty(
    #    name="Easing",
    #    default="EASE_IN",
    #    items=easingItems)

    nicecolor = bpy.props.FloatVectorProperty(
        name="Color",
        description="Color",
        subtype='COLOR',
        min=0.0,
        max=1.0,
    )
    updated = False
    lastcolor = bpy.props.FloatVectorProperty(
        name="Color",
        description="Color",
        subtype='COLOR',
        min=0.0,
        max=1.0,
    )
    lastpalette = bpy.props.FloatVectorProperty(
        name="Color",
        description="Color",
        subtype='COLOR',
        min=0.0,
        max=1.0,
    )
    open_popup = bpy.props.BoolProperty(name="open popup")


    @classmethod
    def poll(cls, context):
        return context.mode == 'EDIT_MESH'

    def execute(self, context):
        print("execute")
        finalcolor = (self.nicecolor.r, self.nicecolor.g, self.nicecolor.b, 1)

        bm = bmesh.from_edit_mesh(context.object.data)

        faces = [f for f in bm.faces if f.select]

        if faces:
            colors = bm.loops.layers.color.active
            if not colors:
                colors = bm.loops.layers.color.new("Col")

            for f in faces:
                for loop in f.loops:
                    loop[colors] = finalcolor
                    #loop[colors] = (1,0,0,0)
            bmesh.update_edit_mesh(context.object.data)
                
        return {'FINISHED'}

    def check(self, context):
        print("check")
        active_color = bpy.context.tool_settings.vertex_paint.palette.colors.active.color

        print("lastcolor: " + str(self.lastcolor))
        print("nicecolor: " + str(self.nicecolor))
        print("activecolor: " + str(active_color))
        if (self.lastcolor.r != active_color.r) or (self.lastcolor.g != active_color.g) or (self.lastcolor.b != active_color.b):
            if (self.lastcolor.r == self.nicecolor.r) and (self.lastcolor.g == self.nicecolor.g) and (
                        self.lastcolor.b == self.nicecolor.b):
                if self.lastpalette != active_color:
                    self.lastpalette = active_color
                    self.nicecolor = active_color
                    print("palette changed")
                else:
                    print("same")
            else:
                self.lastcolor = bpy.context.tool_settings.vertex_paint.palette.colors.active.color
                self.nicecolor = self.lastcolor #WORK!


        #if self.nicecolor != bpy.context.tool_settings.vertex_paint.palette.colors.active.color:
        #    self.nicecolor = bpy.context.tool_settings.vertex_paint.palette.colors.active.color #NOWORK
        return True

        #bug: if click color and then don't click in window, color gets set to old color

    def invoke(self, context, event):
        print("invoke")
        pal = bpy.data.palettes.get("CustomPalette")
        if pal is None:
            pal = bpy.data.palettes.new("CustomPalette")
            # add a color to that palette
            R = pal.colors.new()
            R.color = (1, 0, 0)
            G = pal.colors.new()
            G.color = (0, 1, 0)
            B = pal.colors.new()
            B.color = (0, 0, 1)
            yellow = pal.colors.new()
            yellow.color = (1, 1, 0)
            magenta = pal.colors.new()
            magenta.color = (1, 0, 1)
            teal = pal.colors.new()
            teal.color = (0, 1, 1)
        bpy.context.tool_settings.vertex_paint.palette = pal

        loc = event.mouse_region_x, event.mouse_region_y #Get mouse coordinates
        bpy.ops.object.mode_set(mode="VERTEX_PAINT")
        bpy.ops.paint.sample_color(location=loc) #Sample colors under the cursor
        bpy.ops.object.mode_set(mode="EDIT")
        self.nicecolor = bpy.data.brushes['Draw'].color #Set default color to the sampled color (of the brush)


        self.lastcolor = self.nicecolor
        self.lastpalette = bpy.context.tool_settings.vertex_paint.palette.colors.active.color
        #return context.window_manager.invoke_props_dialog(self)
        #self.execute(context)

        return context.window_manager.invoke_props_popup(self, event)

        #return context.window_manager.popup_menu_pie()





    def draw(self, context):
        layout = self.layout

        ts = bpy.context.tool_settings
        if ts.vertex_paint.palette:
            layout.template_palette(ts.vertex_paint, "palette", color=True)
        #layout.prop(ts.image_paint,"palette")
        layout.prop(self, "nicecolor")
        #layout.prop(self, "easingType")


    #def draw(self, context):


    #    nicecolor = bpy.context.tool_settings.image_paint.brush

    #    layout = self.layout
    #    ts = context.tool_settings

    #    pie = layout.menu_pie()
    #    row = pie.row()
    #    # add a colour swatch that can popup a colour picker
    #    row.prop(nicecolor,"color")
    #    box = pie.box()
    #    #show the colour picker directly
    #    box.template_color_picker(nicecolor, 'color', value_slider=True)


def register():
    bpy.utils.register_class(MESH_xOT_SetVertexColor)
    
def unregister():
    bpy.utils.unregister_class(MESH_xOT_SetVertexColor)
    
if __name__ == "__main__":
    register()