omz:forum

    • Register
    • Login
    • Search
    • Recent
    • Popular

    Welcome!

    This is the community forum for my apps Pythonista and Editorial.

    For individual support questions, you can also send an email. If you have a very short question or just want to say hello β€” I'm @olemoritz on Twitter.


    Odd Crash Report

    Pythonista
    crash objc scene
    5
    15
    4662
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • stephen
      stephen last edited by

      Report said:

      The app was terminated due to an Objective-C exception. Details below:

      2020-04-30 08:45:32.339467
      -[UIImageView _resolveAndDiscard]: unrecognized selector sent to instance 0x157fb5be0

      Has anyone generated this while using scene module? i cant think of how an unrecognized selector would be sent when im not manually sending objc selectors...

      mikael 1 Reply Last reply Reply Quote 0
      • mikael
        mikael @stephen last edited by

        @stephen, how are you using UIImageView in scene? Maybe there is some clue there.

        How consistent is this crash?

        Also, I think you were aware of the crashiness of load_from_url, so you are probably not using it?

        stephen 1 Reply Last reply Reply Quote 0
        • stephen
          stephen @mikael last edited by

          @mikael said:

          @stephen, how are you using UIImageView in scene? Maybe there is some clue there.

          How consistent is this crash?

          Also, I think you were aware of the crashiness of load_from_url, so you are probably not using it?

          this is why its so odd.. πŸ˜¬πŸ§πŸ€“ im not using UIImageView. also nt using `load_from_url. the crash was pretty consistent, would crash about every 5 time i would us Run.. but whats even more odd is once i commented out some code that handled a pond for my game it sems to have stopped.. ill post the code.. but it probably wont run or u without everything and assets.. but ill show what i was alling how and that its all fom scene (i know scene use ui but i figured id need to exclusivly call UIImageView to get this issue)

          
          class GameController:
          	eBoxes = []
          	nodes=  []
          	main = None
          	pointer = None
          	
          	@classmethod
          	def update(cls, dt):
          		for eBox in cls.eBoxes:
          			eBox.update(dt)
          			
          	@classmethod
          	def touch_began(cls, touch):
          		cls.pointer.touch_began(touch)
          		for n in cls.nodes:
          			if n.point_from_scene(touch.location) in n.frame:
          				cls.main.update_selected(n)
          		
          	@classmethod
          	def touch_moved(cls, touch):
          		cls.pointer.touch_moved(touch)
          		
          	@classmethod
          	def touch_ended(cls, touch):
          		cls.pointer.touch_ended(touch)
          		
          
          class Pond(SpriteNode):
          	def __init__(self, p, *args, **kwargs):
          		self.texture = Texture('./desert/desert-pond-top.png')
          		self.position = Point(200, 60)
          		SpriteNode.__init__(self,
          			texture = self.texture,
          			position = self.position,
          			parent = p,
          			*args, **kwargs)
          		self.fishingSpots=[
          			Point(-350, 100),
          			Point(50, -200),
          			Point(50, 225),
          			Point(325, 100)]
          		self.fishingNodes=[
          			FishingSpotBrush(self, [], position=Point(0, 0)),
          			FishingSpotBrush(self, [], position=Point(0, 0))]
          		for brush in self.fishingNodes:
          			from random import choice
          			x, y = choice(self.fishingSpots)
          			brush.run_action(Action.move_to(x, y, 5))
          			
          	self.Animate()
          			def Animate(self):
          		scale = move = alpha=[]
          		r = rx = ry = 0
          		for x in range(100):
          			r=random.random()
          			inRange = 0.80 < r < 1
          			if inRange:
          				scale.append(a.scale_to(r + 0.10, 5, TIMING_SINODIAL))
          				alpha.append(a.fade_to(r - 0.10, 5, TIMING_SINODIAL))
          			rx, ry=random.randrange(5, 30), random.randrange(5, 10)
          			move.append(a.move_by(rx, ry, 5, TIMING_SINODIAL))
          			move.append(a.move_by(-rx, -ry, 5, TIMING_SINODIAL))
          		self.run_action(
          			a.repeat(
          				a.group(
          					a.sequence(scale),
          					a.sequence(move)), -1))
          
          class DevMapDesert(SpriteNode):
          	def __init__(self, p, *args, **kwargs):
          		self.texture = Texture('./desert/desert-testing.png')
          		self.size = Size(4096, 4096)
          		SpriteNode.__init__(self,
          			texture = self.texture,
          			size =vself.size,
          			parent = p,
          			*args, **kwargs)
          			
          		self.pondWater=Pond(self)
          			
          	def update(self, dt):
          		
          
          class GO(SpriteNode):
          	def __init__(self, texture='clear.png', name='', hidden=False, *args, **kwargs):
          		self.texture=Texture(texture)
          		self.name=name
          		SpriteNode.__init__(self, texture=self.texture, *args, **kwargs)
          		self._hidden=hidden
          		GameController.nodes.append(self)
          		EventBox(controller=GameController, parent=self.scene, target=self)
          	@property
          	def hidden(self):
          		return self._hidden
          		
          	@hidden.setter
          	def hidden(self, boolean):
          		self._hidden = boolean
          		if self._hidden:
          			self.alpha = 1.0
          		else:
          			self.alpha = 0.0
          	
          	def select(self):
          		pass
          	
          	def deselect(self):
          		pass
          		
          
          
          class BaseSkillNode(GO):
          	def __init__(self, skill, refItems, *args, **kwargs):
          		self.skill=skill
          		self.refItems=refItems
          		self.maxItems=3
          		self.items=list([])
          		self.refill_timer=30
          		self.refill_t=0.0
          		self.travel_timer=120
          		self.skill_level_req=0
          		self.main_level_req=0
          		self.equipment_req=None
          		self.has_items_texture=None
          		self.empty_texture=None
          		self.items_full_texture=None
          		self.gameObjects=[]
          		self.anim_present=None
          		self.anim_idle=None
          		self.anim_move=None
          		self.anim_gathering=None
          		self.anim_gather_failed=None
          		self.anim_gather_success=None
          		self.anim_dismissed=None
          		
          		GO.__init__(self, *args, **kwargs)
          		
          		
          	def Dismiss(self):
           		pass
          	def Present(self):
          		pass
          	def AddItem(self):
          		if len(self.items) == 0:
          			pass
          		print('Added Item')
          		
          	def update(self, dt):
          		if self.refill_timer != None:
          			self.refill_t += dt
          			if self.refill_t >= self.refill_timer:
          				self.AddItem()
          				self.refill_t = 0
          		if self.travel_timer > 0:
          			self.travel_timer -= dt
          			if self.travel_timer <= 0:
          				self.remove_all_actions()
          				self.run_action(self.anim_move())
          
          class FishingSpotBrush(BaseSkillNode):
          	def __init__(self, caller, skill=Skills.Fishing, refItems=[], *args, **kwargs):
          		BaseSkillNode.__init__(self,
          			skill = skill, 
          			refItems = refItems,
          			parent = caller,
          			name = 'Fishing Spot',
          			*args, **kwargs)
          			
          		self.anim_idle = Animations.Fishing_Spot_Idle
          		self.anim_move = Animations.Fishing_Spot_Move
          		self.anim_dismissed = Animations.Fishing_Spot_Dismissed
          		
          		self.gameObjects.append(SpriteNode(
          			texture = Texture('fishing-spot-idle.png'),
          			parent = self, 
          			color = '#ffd1d1'))
          			
          		self.gameObjects.append(SpriteNode(
          			texture = Texture('fishing-spot-idle.png'),
          			parent = self,
          			color = '#f3faff'))
          			
          		for go in self.gameObjects:
          			self.anim_idle(go)
          
          class main(Scene):
          	def setup(self):		
          		self.map=Desert(parent=self)
          		self.UIPlayer=PlayerSprite(self)
          		self.dir=0
          		Pointer(self)
          		self.FootSpeed=40
          		GameController.main=self
          		self.selected=None
          		
          		self.hud_test=Text(
          			pos=Point(self.size[0]/2, self.size[1]),
          			title=f'Focus',
          			text='None..',
          			parent=self)
          		
          	def update_selected(self, node):
          		node.add_child(
          			SpriteNode(
          				Texture('spc:Fire15'),
          				position=node.position))
          		if self.selected != None:
          			self.selected.deselect()
          			self.selected=None
          		self.selected = node
          		node.select()
          		self.hud_test.update_text(f'{node.name}')
          	
          	def did_change_size(self):
          		pass
          		
          	def did_evaluate_actions(self):
          		pass
          		
          	def update(self):
          		GameController.update(self.dt)
          		self.map.update(self, self.dt)
          		
          	def move(self, target):
          		loc=target
          		loc=Point((loc[0]-self.size[0]/2)*-1, (loc[1]-self.size[1]/2)*-1)
          		dur=Dist(self.UIPlayer.position, target)
          		self.map.run_action(a.repeat(a.move_by(loc[0]*self.FootSpeed*self.dt, loc[1]*self.FootSpeed*self.dt, 1), -1), 'pMoving')
          		
          	def touch_began(self, touch):
          		self.move(touch.location)
          		GameController.touch_began(touch)
          		self.UIPlayer.rotation=LookAt(self.UIPlayer.position, touch.location)
          		
          	def touch_moved(self, touch):
          		self.move(touch.location)
          		GameController.touch_moved(touch)
          		self.UIPlayer.rotation=LookAt(self.UIPlayer.position, touch.location)
          		
          	def touch_ended(self, touch):
          		GameController.touch_ended(touch)
          		self.map.run_action(a.move_by(0, 0, 0.1), 'pMoving')
          		
          if __name__=='__main__':
          	run(main(), show_fps=True)
          
          
          

          I believe that is everything that would be used with pond for now. Any Ideas?

          .

          1 Reply Last reply Reply Quote 0
          • JonB
            JonB last edited by

            Can you install @dgelessus 's faulthandler, then reproduce the crash? That will show the full stacktrace at least.

            Which code commented out fixes the crash?

            I have seen some strange unrecognized selectors when something gets totally borked, maybe some memory got overwritten.

            stephen 1 Reply Last reply Reply Quote 0
            • stephen
              stephen @JonB last edited by

              @JonB said:

              Can you install @dgelessus 's faulthandler, then reproduce the crash? That will show the full stacktrace at least.

              Which code commented out fixes the crash?

              I have seen some strange unrecognized selectors when something gets totally borked, maybe some memory got overwritten.

              sorry for the weird commenting lol i just coppied from script

              yea i will give FaultHandler a try Thank You!

              
              ###############BEGIN DEBUG BLOCK###############
              #FIXME: TESTING..
              ##class Pond(SpriteNode):
              ##	def __init__(self, p, *args, **kwargs):
              ##		self.texture = Texture('./desert/desert-pond-top.png')
              ##		self.position=Point(200, 60)
              ##		SpriteNode.__init__(self,
              ##			texture=self.texture,
              ##			position=self.position,
              ##			parent=p, *args, **kwargs)
              ##		self.fishingSpots=[
              ##			Point(-350, 100),
              ##			Point(50, -200),
              ##			Point(50, 225),
              ##			Point(325, 100)]
              ##		self.fishingNodes=[]
              ##
              ##			FishingSpotBrush(self, [], position=Point(0, 0)),#self.fishingSpots[0]),
              ##			FishingSpotBrush(self, [], position=Point(0, 0))]#self.fishingSpots[1])]
              ##		for brush in self.fishingNodes:
              ##			import random
              ##			x, y=random.choice(self.fishingSpots)
              ##			brush.run_action(Action.move_to(x, y, 5))
              ##
              ##
              ##			
              ##		self.Animate()
              ##	def Animate(self):
              ##		scale = move = alpha=[]
              ##		r = rx = ry = 0
              ##		for x in range(100):
              ##			r=random.random()
              ##			inRange = 0.80 < r < 1
              ##			if inRange:
              ##				scale.append(a.scale_to(r+.10, 5, TIMING_SINODIAL))
              ##				alpha.append(a.fade_to(r-.10, 5, TIMING_SINODIAL))
              ##			rx, ry=random.randrange(5, 30), random.randrange(5, 10)
              ##			move.append(a.move_by(rx, ry, 5, TIMING_SINODIAL))
              ##			move.append(a.move_by(-rx, -ry, 5, TIMING_SINODIAL))
              ##		self.run_action(
              ##			a.repeat(
              ##				a.group(
              ##					a.sequence(scale),
              ##					a.sequence(move)), -1))
              ##
              ##class DevMapDesert(SpriteNode):
              ##	def __init__(self, p, *args, **kwargs):
              ##		self.texture = Texture('./desert/desert-testing.png')
              ##				self.size=Size(4096, 4096)
              ##		SpriteNode.__init__(self,
              ##			texture=self.texture,
              ##			size=self.size,
              ##			parent=p, *args, **kwargs)
              ##				self.pondWater=Pond(self)
              ##			def update(self, dt):
              ##		pass
              ##		
              ###############END DEBUG BLOCK###############
              
              
              1 Reply Last reply Reply Quote 0
              • JonB
                JonB last edited by

                Try commenting out the self.Animate. I wonder if the repeat forever could be a problem, say if there was a memory leak somewhere.

                stephen 1 Reply Last reply Reply Quote 0
                • stephen
                  stephen @JonB last edited by

                  @JonB Good Idea!

                  1 Reply Last reply Reply Quote 0
                  • stephen
                    stephen last edited by

                    @JonB i cannot seem to find FaultHandler

                    cvp 1 Reply Last reply Reply Quote 0
                    • stephen
                      stephen last edited by stephen

                      @JonB @mikael I believe i found the one issue.

                      
                              r1= SpriteNode(
                      			Texture(ui.Image.named('./assets/player-ring1.png')),
                      			position=p.size/2,
                      			scale=0.5,
                      			speed=2,
                      			alpha=0,
                      			parent=main)
                      		r2= SpriteNode(
                      			Texture(ui.Image.named('./assets/player-ring2.png')),
                      			position=p.size/2,
                      			scale=0.5,
                      			speed=2,
                      			alpha=0,
                      			parent=main)
                      
                      

                      i think Texture(ui.Image.named('./assets/player-ring1.png')), is whats crashing but i agree on the memory leak. so im going to go over every object and see if i can find what hanging up..

                      1 Reply Last reply Reply Quote 0
                      • cvp
                        cvp @stephen last edited by

                        @stephen said:

                        cannot seem to find FaultHandler

                        https://github.com/dgelessus/pythonista_startup

                        1 Reply Last reply Reply Quote 1
                        • stephen
                          stephen last edited by stephen

                          @cvp ... guess who looked right at it earlier and didmt see it... πŸ‘‰πŸΌπŸ€¦πŸ»β€β™‚οΈ

                          1 Reply Last reply Reply Quote 0
                          • njm
                            njm last edited by

                            @stephen said:

                            for brush in self.fishingNodes:
                            from random import choice
                            x, y = choice(self.fishingSpots)
                            brush.run_action(Action.move_to(x, y, 5))

                            self.Animate()
                                    def Animate(self):
                                scale = move = alpha=[]
                                r = rx = ry = 0
                                for x in range(100):
                            

                            @stephen, I'm confused by the indentation and code sequence in this region of class Pond. Maybe the problem is here?

                            stephen 1 Reply Last reply Reply Quote 0
                            • stephen
                              stephen @njm last edited by stephen

                              @njm i see lol this was a section that was commented out by another script i been working on and the uncomment function is still buggy. normally that code is like the following. otherwise the script wouldnt run at all

                              
                                  for brush in self.fishingNodes:
                              		from random import choice
                              		x, y = choice(self.fishingSpots)
                              		brush.run_action(Action.move_to(x, y, 5))
                              
                              	self.Animate()
                              	
                              def Animate(self):
                                  scale = move = alpha=[]
                                  r = rx = ry = 0
                                  for x in range(100):
                              
                              1 Reply Last reply Reply Quote 0
                              • stephen
                                stephen last edited by

                                @JonB @mikael @cvp @njm turned out he ui.Image calls inside Texture combined with two corrupted images was the problem. when i removed the ui.Image calls i still crashed but with no stack report at all then i somehow came across two png files the were 101b in size instead of the 1.1MB lol no more crashes. thanks for all the help everyone!

                                cvp 1 Reply Last reply Reply Quote 0
                                • cvp
                                  cvp @stephen last edited by

                                  @stephen πŸ‘

                                  1 Reply Last reply Reply Quote 1
                                  • First post
                                    Last post
                                  Powered by NodeBB Forums | Contributors