2017-02-17 9 views
0

나는 exec()을 통해 실행하는 파이썬 구동 DSL을 가지고있다. 이 DSL에는 CFFI를 통한 네이티브 함수 호출이 포함됩니다.이 tkinter/exec()/cffi 조합에서이 스택 오버 플로우를 수정하는 방법은 무엇입니까?

C 함수의 스택에 uint16_t이 할당되어있는 소수의 C가 호출되는 네이티브 함수를 호출 할 때 스택 오버플로가 발생합니다 (즉, 불규칙하게 만들었습니다!). 파이썬 응용 프로그램은 타이머 (master.after(1000, self.tick)) 이벤트로 DSL을 호출하는 GUI 인 tkinter입니다.이 이벤트는 스택 자체의 좋은 부분을 차지할 수 있습니다.

여기에 재귀 호출이 없습니다.

OS 10.12.3, 파이썬 3.6.0rc1 X : 1.9.1

내가 resource.setrlimit(resource.RLIMIT_STACK, (resource.RLIM_INFINITY, resource.RLIM_INFINITY)) 알고 있어요 (v3.6.0rc1 29a273eee9a5 12 월 (6) 2016 16시 24분 13초), CFFI하지만, 수퍼 유저 권한이 필요합니다. 나는 이것이 필요하지 않다는 것을 믿는다. 왜냐하면 두 함수 호출을 위해 스택이 남아있는 것이 정상적이지 않기 때문이다.

CFFI 또는 exec()가 수신자의 스택 크기를 제한 할 수 있습니까?

기능은 DSL에서 호출되는 :

ffi_builder.cdef(''' 
//... 
int FooNode_SetProperty(struct FooNode *pThis, const char *szPropertyName, int nValue); 
''') 

def set_channel(node, channel): 
    node.SetProperty(b'channel', channel) 

exec 호출 코드 :

self._globals = { 
     '__builtins__': __builtins__, 
     # https://docs.python.org/3/library/functions.html#eval "If the globals dictionary is present and lacks 
     # ‘__builtins__’, the current globals are copied into globals before expression is parsed." 

     'run': { 
      'duration': 60 * MICROS, 
      'success': None 
     }, 

     'set_channel': set_channel, 
     'turn_off': turn_off, 
     'turn_on': turn_on, 
     'finish': finish, 
     # 6 more functions here 
    } 

    exec(event_text, self._globals, {}) 

애플 보고서 조각 :

Crashed Thread:  0 Dispatch queue: com.apple.main-thread 

Exception Type:  EXC_CRASH (SIGABRT) 
Exception Codes:  0x0000000000000000, 0x0000000000000000 
Exception Note:  EXC_CORPSE_NOTIFY 

Application Specific Information: 
[35633] stack overflow 

Thread 0 Crashed:: Dispatch queue: com.apple.main-thread 
0 libsystem_kernel.dylib   0x00000001003bfdd6 __pthread_kill + 10 
1 libsystem_pthread.dylib   0x00007fffe03dc787 pthread_kill + 90 
2 libsystem_c.dylib    0x00007fffe02564bb __abort + 140 
3 libsystem_c.dylib    0x00007fffe0256d7e __stack_chk_fail + 205 
4 libmush_real.dylib   0x0000000104c4d714 send_counters_report_request + 532 

(이 스레드는 정말 애플에서, 여기에 아무 것도 끝나지 보고)

답변

0

디버거와 연결되도록 관리합니다.

현재 호출 후에 아무것도없는 스택은 일반적으로 스택 변수에 대한 포인터를 통해 스택이 덮어 써 졌다는 표시입니다.