1
Выполнение следующего кода в Python 3 дает мне segfault. Это ошибка, или я делаю то, что я не должен делать?Python 3/PyGObject: Попытка пакета GTK.Box() вызывает segfault
Я пометил место, где будет происходя выдаёт ошибку сегментации с DEBUG оператора печати (в классе TabbedWebkitBrowser):
from gi.repository import Gtk, WebKit
class UI:
def __init__(self, config = dict()):
self.config = config
self.window = MainWindow(self.config)
self.run()
def run(self):
self.window.show_all()
Gtk.main()
class MainWindow(Gtk.Window):
def __init__(self, config = dict()):
self.title = config['title'] or "Untitled"
Gtk.Window.__init__(self, title = self.title)
self.set_size_request(800, 600)
self.connect("delete-event", Gtk.main_quit)
top_vbox= Gtk.Box(orientation = Gtk.Orientation.VERTICAL, spacing = 0)
self.add(top_vbox)
main_header = Gtk.Box()
main_content = Gtk.HBox()
main_footer = Gtk.Box()
top_vbox.pack_start(main_header, expand = False, fill = False, padding = 0)
top_vbox.pack_start(main_content, expand = True, fill = True, padding = 0)
top_vbox.pack_start(main_footer, expand = False, fill = False, padding = 0)
left_sidebar = Gtk.Box()
browser = TabbedWebKitBrowser()
right_sidebar = Gtk.Box()
main_content.pack_start(left_sidebar, expand = False,fill = False, padding = 0)
main_content.pack_start(browser, expand = True, fill = True, padding = 0)
main_content.pack_start(right_sidebar, expand = False, fill = False, padding = 0)
class TabbedWebKitBrowser(Gtk.VBox):
def __init__(self):
self.navbar = Gtk.HBox()
# This is a tabbed collection of WebKit.WebView instances
self.tabs = Gtk.Notebook()
wk = WebKit.WebView()
self.tabs.prepend_page(wk)
wk.load_uri('http://www.interference.cc')
self.tabs.show_all()
print("DEBUG: This .pack_start() is where the segfault is occuring ...")
self.pack_start(self.navbar, expand = True, fill = True, padding = 0)
print("DEBUG: Didn't make it to this point ...")
self.pack_start(self.tabs, expand = True, fill = True, padding = 0)
config = {'title': 'Test program ...'}
x = UI(config)
Я выполнил программу в GDB и сделал трассировку после Segfault. Вот что я получил:
Starting program: /usr/bin/python3 UI.py
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
DEBUG: This .pack_start() is where the segfault is occuring ...
[New Thread 0x7fff97fff700 (LWP 14066)]
[New Thread 0x7fff9ce91700 (LWP 14065)]
[New Thread 0x7fff9e3d0700 (LWP 14064)]
[New Thread 0x7fffdebd3700 (LWP 14063)]
[New Thread 0x7fffed4d4700 (LWP 14062)]
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff44400bd in ??() from /usr/lib/x86_64-linux-gnu/libgtk-3.so.0
(gdb) bt
#0 0x00007ffff44400bd in ??() from /usr/lib/x86_64-linux-gnu/libgtk-3.so.0
#1 0x00007ffff5d6ed90 in ffi_call_unix64() from /usr/lib/x86_64-linux-gnu/libffi.so.6
#2 0x00007ffff5d6e7f8 in ffi_call() from /usr/lib/x86_64-linux-gnu/libffi.so.6
#3 0x00007ffff6732ae4 in ??() from /usr/lib/python3/dist-packages/gi/_gi.cpython-34m-x86_64-linux-gnu.so
#4 0x00007ffff67343e8 in ??() from /usr/lib/python3/dist-packages/gi/_gi.cpython-34m-x86_64-linux-gnu.so
#5 0x00007ffff672859e in ??() from /usr/lib/python3/dist-packages/gi/_gi.cpython-34m-x86_64-linux-gnu.so
#6 0x0000000000504127 in PyEval_EvalFrameEx()
#7 0x00000000004c9fb5 in ??()
#8 0x000000000050ea0b in ??()
#9 0x0000000000564024 in ??()
#10 0x00000000005997ea in ??()
#11 0x0000000000504127 in PyEval_EvalFrameEx()
#12 0x00000000004c9fb5 in ??()
#13 0x000000000050ea0b in ??()
#14 0x0000000000564024 in ??()
#15 0x00000000005997ea in ??()
#16 0x0000000000504127 in PyEval_EvalFrameEx()
#17 0x00000000004c9fb5 in ??()
#18 0x000000000050ea0b in ??()
#19 0x0000000000564024 in ??()
#20 0x00000000005997ea in ??()
#21 0x0000000000504127 in PyEval_EvalFrameEx()
#22 0x00000000005a9cb5 in PyEval_EvalCodeEx()
#23 0x00000000005e7105 in ??()
#24 0x00000000005e71c9 in PyRun_FileExFlags()
#25 0x00000000005e79aa in PyRun_SimpleFileExFlags()
#26 0x00000000005fb69d in Py_Main()
#27 0x00000000004c2e7f in main()
Любые идеи?
Ах, спасибо! Вот и все. Вы знаете, почему это может вызвать segfault вместо того, чтобы бросать исключение/ошибку какого-то рода? –
Извините, я не знаю. Вероятно, потому что gtk + написан на C, и есть только привязки python, и привязки пропускают некоторые проверки. – elya5
Это имеет смысл. Я, вероятно, просто перейду к этому и сделаю его небольшим багом, так как я предполагаю, что эти проверки, вероятно, должны существовать, а не вызывать segfault. –