2016-06-23 3 views
0

Я пишу плагин для Ida (в python), который использует систему хранения значений ключа с дистанционным ключом Etcd. Моя проблема заключается в том, что при попытке получить блокировку на сервереIda Pro 6.9 crash

 lock = etcd.Lock(self.client, 'ida_lock') 
     Should timeout after 30 seconds. Hopefully that is enough. 
     lock.acquire(blocking=True,lock_ttl=None,timeout=30) 
     if lock.is_acquired: 

      data,idc_file = self.get_idc_data() 

      if os.path.isfile('expendable.idc'): 
       self.client.write('/fREd/' + self.md5 + '/all/', idc_file, prevValue = open('expendable.idc','r').readlines()) 
      else: 
       self.client.write('/fREd/' + self.md5 + '/all/', idc_file) 
     lock.release() 

, как это так, Ида замерзает и мне было интересно, если кто-то какое-либо представление о том, почему это происходит и как это исправить.

Так для справки метод, который включает в себя это называется с помощью клавиши быстрого доступа

idaapi.add_hotkey('Ctrl-.', self.push_data) 

и нет никаких сомнений, что это замок, который вызывает проблему.

Вы можете посмотреть на питона-etcd источник в https://github.com/jplana/python-etcd

ответ

1

Есть ключи уже существуют в каталоге /_locks/ida_lock.

Для просмотра списка файлов в /_locks/ida_lock:

etcdctl ls /_locks/ida_lock 

Чтобы спасти себя от этого запустите:

etcdctl rm /_locks/ida_lock --dir --recursive 

Чтобы избежать такой ситуации, вы можете запустить lock.release() в finally блоке, как если бы вы не отпустите, файл останется под /_locks/ida_lock.
Кроме того, вы можете добавить несколько конфигураций ведения журнала (которые вы можете ссылаться на here), чтобы больше разобраться в решении подобных проблем.

+0

Прошу прощения, я не совсем понимаю. Является ли следствием неправильное использование замков? Если да, пожалуйста, уточните. –

+0

почти справа, но что-то требует вашего внимания. Если «self.client.write» генерирует исключение в вашем коде (просто «если»), ваш код не будет вызывать '' 'lock.release()' '', который оставит ключ в etcd. то в следующий раз, когда вы захотите заблокировать, он просто подождет ... аргумент таймаута, похоже, не работает в этом состоянии ... –

+0

благодарим вас за разработку. –

 Смежные вопросы

  • Нет связанных вопросов^_^