# Buggy code
def _onKeyDown(self, evt):
    """Capture key press."""
    key = self._get_key(evt)
    evt.Skip()
    FigureCanvasBase.key_press_event(self, key, guiEvent=evt)


# Traceback (ImportError)
[michael@localhost play]$ gdb --args python segfault-gui.py
GNU gdb (GDB) Fedora 7.7.1-19.fc20
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from python...Reading symbols from /usr/lib/debug/usr/bin/python2.7.debug...done.
done.
(gdb) r
Starting program: /usr/bin/python segfault-gui.py
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".
Traceback (most recent call last):
File "/usr/share/gdb/auto-load/usr/lib64/libgobject-2.0.so.0.3800.2-gdb.py", line 9, in <module>
from gobject import register
File "/usr/share/glib-2.0/gdb/gobject.py", line 3, in <module>
import gdb.backtrace
ImportError: No module named backtrace
Missing separate debuginfo for /lib64/libgraphite2.so.3
Try: yum --enablerepo='*debug*' install /usr/lib/debug/.build-id/90/82e46860379c3dff9004eb8c9834e50afbb528.debug
[New Thread 0x7fffee6b1700 (LWP 3733)]
[New Thread 0x7fffedeb0700 (LWP 3734)]
[New Thread 0x7fffed6af700 (LWP 3735)]
[New Thread 0x7fffeceae700 (LWP 3736)]
[Thread 0x7fffeceae700 (LWP 3736) exited]

Program received signal SIGSEGV, Segmentation fault.
wxEvtHandler::SearchDynamicEventTable (this=this@entry=0x23e08d0, event=...)
at src/common/event.cpp:1412
1412            if ((event.GetEventType() == entry->m_eventType) &amp;&amp; (entry->m_fn != 0))
(gdb) bt
#0  wxEvtHandler::SearchDynamicEventTable (this=this@entry=0x23e08d0,
event=...) at src/common/event.cpp:1412
#1  0x0000003a91ef09f2 in wxEvtHandler::ProcessEvent (this=0x23e08d0,
event=...) at src/common/event.cpp:1297
#2  0x0000003a924079f7 in gtk_window_key_press_callback (
widget=widget@entry=0x10f4170, gdk_event=0x23e66b0,
win=win@entry=0x23e08d0) at src/gtk/window.cpp:1034
#3  0x0000003a94b484ec in _gtk_marshal_BOOLEAN__BOXED (closure=0x1fdd550,
return_value=0x7fffffffc970, n_param_values=<optimized out>,
param_values=0x7fffffffca20, invocation_hint=<optimized out>,
marshal_data=<optimized out>) at gtkmarshalers.c:86
#4  0x0000003a81e10298 in g_closure_invoke (closure=0x1fdd550,
return_value=return_value@entry=0x7fffffffc970, n_param_values=2,
param_values=param_values@entry=0x7fffffffca20,
invocation_hint=invocation_hint@entry=0x7fffffffc9c0) at gclosure.c:777
#5  0x0000003a81e2235d in signal_emit_unlocked_R (node=node@entry=0x102b7b0,
detail=detail@entry=0, instance=instance@entry=0x10f4170,
emission_return=emission_return@entry=0x7fffffffcad0,
instance_and_params=instance_and_params@entry=0x7fffffffca20)
at gsignal.c:3586
#6  0x0000003a81e29ddd in g_signal_emit_valist (instance=<optimized out>,
signal_id=<optimized out>, detail=<optimized out>,
var_args=var_args@entry=0x7fffffffcbb0) at gsignal.c:3340
#7  0x0000003a81e2a3af in g_signal_emit (instance=instance@entry=0x10f4170,
signal_id=<optimized out>, detail=detail@entry=0) at gsignal.c:3386
#8  0x0000003a94c777a4 in gtk_widget_event_internal (
widget=widget@entry=0x10f4170, event=event@entry=0x23e66b0)
at gtkwidget.c:5017
#9  0x0000003a94c77a79 in IA__gtk_widget_event (
widget=widget@entry=0x10f4170, event=event@entry=0x23e66b0)
at gtkwidget.c:4814
#10 0x0000003a94c8d2bb in IA__gtk_window_propagate_key_event (
window=window@entry=0x10645b0, event=event@entry=0x23e66b0)
at gtkwindow.c:5199
#11 0x0000003a94c8fe13 in gtk_window_key_press_event (widget=0x10645b0,
event=0x23e66b0) at gtkwindow.c:5229
#12 0x0000003a94b484ec in _gtk_marshal_BOOLEAN__BOXED (closure=0x102b760,
return_value=0x7fffffffce40, n_param_values=<optimized out>,
param_values=0x7fffffffcef0, invocation_hint=<optimized out>,
marshal_data=<optimized out>) at gtkmarshalers.c:86
#13 0x0000003a81e10298 in g_closure_invoke (closure=closure@entry=0x102b760,
return_value=return_value@entry=0x7fffffffce40, n_param_values=2,
param_values=param_values@entry=0x7fffffffcef0,
invocation_hint=invocation_hint@entry=0x7fffffffce90) at gclosure.c:777
#14 0x0000003a81e2211b in signal_emit_unlocked_R (node=node@entry=0x102b7b0,
detail=detail@entry=0, instance=instance@entry=0x10645b0,
emission_return=emission_return@entry=0x7fffffffcfa0,
instance_and_params=instance_and_params@entry=0x7fffffffcef0)
at gsignal.c:3624
---Type <return> to continue, or q <return> to quit---
#15 0x0000003a81e29ddd in g_signal_emit_valist (instance=<optimized out>,
signal_id=<optimized out>, detail=<optimized out>,
var_args=var_args@entry=0x7fffffffd080) at gsignal.c:3340
#16 0x0000003a81e2a3af in g_signal_emit (instance=instance@entry=0x10645b0,
signal_id=<optimized out>, detail=detail@entry=0) at gsignal.c:3386
#17 0x0000003a94c777a4 in gtk_widget_event_internal (
widget=widget@entry=0x10645b0, event=event@entry=0x23e66b0)
at gtkwidget.c:5017
#18 0x0000003a94c77a79 in IA__gtk_widget_event (
widget=widget@entry=0x10645b0, event=event@entry=0x23e66b0)
at gtkwidget.c:4814
#19 0x0000003a94b467e7 in IA__gtk_propagate_event (widget=0x10645b0,
event=0x23e66b0) at gtkmain.c:2464
#20 0x0000003a94b46b0b in IA__gtk_main_do_event (event=0x23e66b0)
at gtkmain.c:1685
#21 0x0000003a9526040c in gdk_event_dispatch (source=source@entry=0x867810,
callback=<optimized out>, user_data=<optimized out>)
at gdkevents-x11.c:2403
#22 0x0000003a80a492a6 in g_main_dispatch (context=0xc1f0b0) at gmain.c:3066
#23 g_main_context_dispatch (context=context@entry=0xc1f0b0) at gmain.c:3642
#24 0x0000003a80a49628 in g_main_context_iterate (context=0xc1f0b0,
block=block@entry=1, dispatch=dispatch@entry=1, self=<optimized out>)
at gmain.c:3713
#25 0x0000003a80a49a3a in g_main_loop_run (loop=0x10e9ae0) at gmain.c:3907
#26 0x0000003a94b45b57 in IA__gtk_main () at gtkmain.c:1257
#27 0x0000003a923f718a in wxEventLoop::Run (this=0x10f6310)
at src/gtk/evtloop.cpp:76
#28 0x0000003a92476a3b in wxAppBase::MainLoop (this=this@entry=0xa93950)
at src/common/appcmn.cpp:312
#29 0x00007ffff14293af in wxPyApp::MainLoop (this=0xa93950)
at src/helpers.cpp:215
#30 0x00007ffff146a81c in _wrap_PyApp_MainLoop (args=<optimized out>)
at src/gtk/_core_wrap.cpp:31691
#31 0x00000039a7ce16f2 in ext_do_call (nk=<optimized out>,
na=<optimized out>, flags=<optimized out>, pp_stack=0x7fffffffd5a0,
func=<built-in function PyApp_MainLoop>)
at /usr/src/debug/Python-2.7.5/Python/ceval.c:4408
#32 PyEval_EvalFrameEx (
f=f@entry=Frame 0x10f8670, for file /usr/lib64/python2.7/site-packages/wx-2.8-gtk2-unicode/wx/_core.py, line 7306, in MainLoop (args=(<App(this=<PySwigObject at remote 0x7ffff7ef0360>, stdioWin=None, saveStdio=(<file at remote 0x7ffff7f99150>, <file at remote 0x7ffff7f991e0>)) at remote 0x7ffff1977490>,), kwargs={}), throwflag=throwflag@entry=0)
at /usr/src/debug/Python-2.7.5/Python/ceval.c:2779
#33 0x00000039a7ce21dd in PyEval_EvalCodeEx (co=<optimized out>,
globals=<optimized out>, locals=locals@entry=0x0,
args=args@entry=0x7ffff1751728, argcount=1, kws=kws@entry=0x0,
kwcount=kwcount@entry=0, defs=defs@entry=0x0, defcount=defcount@entry=0,
closure=0x0) at /usr/src/debug/Python-2.7.5/Python/ceval.c:3330
---Type <return> to continue, or q <return> to quit---
#34 0x00000039a7c6f0d8 in function_call (func=<function at remote 0x827500>,
arg=(<App(this=<PySwigObject at remote 0x7ffff7ef0360>, stdioWin=None, saveStdio=(<file at remote 0x7ffff7f99150>, <file at remote 0x7ffff7f991e0>)) at remote 0x7ffff1977490>,), kw=0x0)
at /usr/src/debug/Python-2.7.5/Objects/funcobject.c:526
#35 0x00000039a7c4a0d3 in PyObject_Call (
func=func@entry=<function at remote 0x827500>,
arg=arg@entry=(<App(this=<PySwigObject at remote 0x7ffff7ef0360>, stdioWin=None, saveStdio=(<file at remote 0x7ffff7f99150>, <file at remote 0x7ffff7f991e0>)) at remote 0x7ffff1977490>,), kw=kw@entry=0x0)
at /usr/src/debug/Python-2.7.5/Objects/abstract.c:2529
#36 0x00000039a7c590c5 in instancemethod_call (
func=<function at remote 0x827500>,
arg=(<App(this=<PySwigObject at remote 0x7ffff7ef0360>, stdioWin=None, saveStdio=(<file at remote 0x7ffff7f99150>, <file at remote 0x7ffff7f991e0>)) at remote 0x7ffff1977490>,), kw=0x0)
at /usr/src/debug/Python-2.7.5/Objects/classobject.c:2602
#37 0x00000039a7c4a0d3 in PyObject_Call (
func=func@entry=<instancemethod at remote 0x8b6280>,
arg=arg@entry=(<App(this=<PySwigObject at remote 0x7ffff7ef0360>, stdioWin=None, saveStdio=(<file at remote 0x7ffff7f99150>, <file at remote 0x7ffff7f991e0>)) at remote 0x7ffff1977490>,), kw=kw@entry=0x0)
at /usr/src/debug/Python-2.7.5/Objects/abstract.c:2529
#38 0x00000039a7cde37c in do_call (nk=<optimized out>, na=1,
pp_stack=0x7fffffffdaf0, func=<instancemethod at remote 0x8b6280>)
at /usr/src/debug/Python-2.7.5/Python/ceval.c:4316
#39 call_function (oparg=<optimized out>, pp_stack=0x7fffffffdaf0)
at /usr/src/debug/Python-2.7.5/Python/ceval.c:4121
#40 PyEval_EvalFrameEx (
f=f@entry=Frame 0x10f84b0, for file /usr/lib64/python2.7/site-packages/wx-2.8-gtk2-unicode/wx/_core.py, line 8010, in MainLoop (self=<App(this=<PySwigObject at remote 0x7ffff7ef0360>, stdioWin=None, saveStdio=(<file at remote 0x7ffff7f99150>, <file at remote 0x7ffff7f991e0>)) at remote 0x7ffff1977490>),
throwflag=throwflag@entry=0)
at /usr/src/debug/Python-2.7.5/Python/ceval.c:2740
#41 0x00000039a7ce0980 in fast_function (nk=<optimized out>, na=1, n=1,
pp_stack=0x7fffffffdc50, func=<function at remote 0x8298c0>)
at /usr/src/debug/Python-2.7.5/Python/ceval.c:4184
#42 call_function (oparg=<optimized out>, pp_stack=0x7fffffffdc50)
at /usr/src/debug/Python-2.7.5/Python/ceval.c:4119
#43 PyEval_EvalFrameEx (
f=f@entry=Frame 0x6cc750, for file segfault-gui.py, line 23, in <module> (), throwflag=throwflag@entry=0)
at /usr/src/debug/Python-2.7.5/Python/ceval.c:2740
#44 0x00000039a7ce21dd in PyEval_EvalCodeEx (co=co@entry=0x7ffff7ed79b0,
globals=globals@entry={'script': '\nimport matplotlib.pyplot as pl\nimport numpy as np\n\nx = np.linspace(0, 1, 100)\ny = x ** 1.4\npl.figure()\npl.plot(x, y)\npl.show()\n', '__builtins__': <module at remote 0x7ffff7f7eb08>, '__file__': 'segfault-gui.py', '__package__': None, 'frame': <Main(this=<PySwigObject a---Type <return> to continue, or q <return> to quit---
t remote 0xe86cf0>) at remote 0x7ffff1928d50>, '__name__': '__main__', 'app': <App(this=<PySwigObject at remote 0x7ffff7ef0360>, stdioWin=None, saveStdio=(<file at remote 0x7ffff7f99150>, <file at remote 0x7ffff7f991e0>)) at remote 0x7ffff1977490>, 'Main': <type at remote 0xc86090>, '__doc__': None, 'wx': <module at remote 0x7ffff7ee8910>},
locals=locals@entry={'script': '\nimport matplotlib.pyplot as pl\nimport numpy as np\n\nx = np.linspace(0, 1, 100)\ny = x ** 1.4\npl.figure()\npl.plot(x, y)\npl.show()\n', '__builtins__': <module at remote 0x7ffff7f7eb08>, '__file__': 'segfault-gui.py', '__package__': None, 'frame': <Main(this=<PySwigObject at remote 0xe86cf0>) at remote 0x7ffff1928d50>, '__name__': '__main__', 'app': <App(this=<PySwigObject at remote 0x7ffff7ef0360>, stdioWin=None, saveStdio=(<file at remote 0x7ffff7f99150>, <file at remote 0x7ffff7f991e0>)) at remote 0x7ffff1977490>, 'Main': <type at remote 0xc86090>, '__doc__': None, 'wx': <module at remote 0x7ffff7ee8910>}, args=args@entry=0x0, argcount=argcount@entry=0,
kws=kws@entry=0x0, kwcount=kwcount@entry=0, defs=defs@entry=0x0,
defcount=defcount@entry=0, closure=closure@entry=0x0)
at /usr/src/debug/Python-2.7.5/Python/ceval.c:3330
#45 0x00000039a7ce22e2 in PyEval_EvalCode (co=co@entry=0x7ffff7ed79b0,
globals=globals@entry={'script': '\nimport matplotlib.pyplot as pl\nimport numpy as np\n\nx = np.linspace(0, 1, 100)\ny = x ** 1.4\npl.figure()\npl.plot(x, y)\npl.show()\n', '__builtins__': <module at remote 0x7ffff7f7eb08>, '__file__': 'segfault-gui.py', '__package__': None, 'frame': <Main(this=<PySwigObject at remote 0xe86cf0>) at remote 0x7ffff1928d50>, '__name__': '__main__', 'app': <App(this=<PySwigObject at remote 0x7ffff7ef0360>, stdioWin=None, saveStdio=(<file at remote 0x7ffff7f99150>, <file at remote 0x7ffff7f991e0>)) at remote 0x7ffff1977490>, 'Main': <type at remote 0xc86090>, '__doc__': None, 'wx': <module at remote 0x7ffff7ee8910>},
locals=locals@entry={'script': '\nimport matplotlib.pyplot as pl\nimport numpy as np\n\nx = np.linspace(0, 1, 100)\ny = x ** 1.4\npl.figure()\npl.plot(x, y)\npl.show()\n', '__builtins__': <module at remote 0x7ffff7f7eb08>, '__file__': 'segfault-gui.py', '__package__': None, 'frame': <Main(this=<PySwigObject at remote 0xe86cf0>) at remote 0x7ffff1928d50>, '__name__': '__main__', 'app': <App(this=<PySwigObject at remote 0x7ffff7ef0360>, stdioWin=None, saveStdio=(<file at remote 0x7ffff7f99150>, <file at remote 0x7ffff7f991e0>)) at remote 0x7ffff1977490>, 'Main': <type at remote 0xc86090>, '__doc__': None, 'wx': <module at remote 0x7ffff7ee8910>}) at /usr/src/debug/Python-2.7.5/Python/ceval.c:689
#46 0x00000039a7cfb71f in run_mod (mod=<optimized out>,
filename=filename@entry=0x7fffffffe3aa "segfault-gui.py",
globals=globals@entry={'script': '\nimport matplotlib.pyplot as pl\nimport numpy as np\n\nx = np.linspace(0, 1, 100)\ny = x ** 1.4\npl.figure()\npl.plot(x, y)\npl.show()\n', '__builtins__': <module at remote 0x7ffff7f7eb08>, '__file__': 'segfault-gui.py', '__package__': None, 'frame': <Main(this=<PySwigObject at remote 0xe86cf0>) at remote 0x7ffff1928d50>, '__name__': '__main__', 'app': <App(this=<PySwigObject at remote 0x7ffff7ef0360>, stdioWin=None, saveStdio=(<file at remote 0x7ffff7f99150>, <file at remote 0x7ffff7f991e0>)) at remote 0x7ffff1977490>, 'Main': <type at remote 0xc86090>, '__doc__': None, 'wx': <module at remote 0x7ffff7ee8910>},
locals=locals@entry={'script': '\nimport matplotlib.pyplot as pl\nimport numpy as np\n\nx = np.linspace(0, 1, 100)\ny = x ** 1.4\npl.figure()\npl.plot(x, ---Type <return> to continue, or q <return> to quit---
y)\npl.show()\n', '__builtins__': <module at remote 0x7ffff7f7eb08>, '__file__': 'segfault-gui.py', '__package__': None, 'frame': <Main(this=<PySwigObject at remote 0xe86cf0>) at remote 0x7ffff1928d50>, '__name__': '__main__', 'app': <App(this=<PySwigObject at remote 0x7ffff7ef0360>, stdioWin=None, saveStdio=(<file at remote 0x7ffff7f99150>, <file at remote 0x7ffff7f991e0>)) at remote 0x7ffff1977490>, 'Main': <type at remote 0xc86090>, '__doc__': None, 'wx': <module at remote 0x7ffff7ee8910>}, flags=flags@entry=0x7fffffffdeb0,
arena=arena@entry=0x6b9570)
at /usr/src/debug/Python-2.7.5/Python/pythonrun.c:1373
#47 0x00000039a7cfc8de in PyRun_FileExFlags (fp=fp@entry=0x6b7bc0,
filename=filename@entry=0x7fffffffe3aa "segfault-gui.py",
start=start@entry=257,
globals=globals@entry={'script': '\nimport matplotlib.pyplot as pl\nimport numpy as np\n\nx = np.linspace(0, 1, 100)\ny = x ** 1.4\npl.figure()\npl.plot(x, y)\npl.show()\n', '__builtins__': <module at remote 0x7ffff7f7eb08>, '__file__': 'segfault-gui.py', '__package__': None, 'frame': <Main(this=<PySwigObject at remote 0xe86cf0>) at remote 0x7ffff1928d50>, '__name__': '__main__', 'app': <App(this=<PySwigObject at remote 0x7ffff7ef0360>, stdioWin=None, saveStdio=(<file at remote 0x7ffff7f99150>, <file at remote 0x7ffff7f991e0>)) at remote 0x7ffff1977490>, 'Main': <type at remote 0xc86090>, '__doc__': None, 'wx': <module at remote 0x7ffff7ee8910>},
locals=locals@entry={'script': '\nimport matplotlib.pyplot as pl\nimport numpy as np\n\nx = np.linspace(0, 1, 100)\ny = x ** 1.4\npl.figure()\npl.plot(x, y)\npl.show()\n', '__builtins__': <module at remote 0x7ffff7f7eb08>, '__file__': 'segfault-gui.py', '__package__': None, 'frame': <Main(this=<PySwigObject at remote 0xe86cf0>) at remote 0x7ffff1928d50>, '__name__': '__main__', 'app': <App(this=<PySwigObject at remote 0x7ffff7ef0360>, stdioWin=None, saveStdio=(<file at remote 0x7ffff7f99150>, <file at remote 0x7ffff7f991e0>)) at remote 0x7ffff1977490>, 'Main': <type at remote 0xc86090>, '__doc__': None, 'wx': <module at remote 0x7ffff7ee8910>}, closeit=closeit@entry=1,
flags=flags@entry=0x7fffffffdeb0)
at /usr/src/debug/Python-2.7.5/Python/pythonrun.c:1359
#48 0x00000039a7cfdb69 in PyRun_SimpleFileExFlags (fp=fp@entry=0x6b7bc0,
filename=filename@entry=0x7fffffffe3aa "segfault-gui.py",
closeit=closeit@entry=1, flags=flags@entry=0x7fffffffdeb0)
at /usr/src/debug/Python-2.7.5/Python/pythonrun.c:951
#49 0x00000039a7cfe093 in PyRun_AnyFileExFlags (fp=fp@entry=0x6b7bc0,
filename=filename@entry=0x7fffffffe3aa "segfault-gui.py",
closeit=closeit@entry=1, flags=flags@entry=0x7fffffffdeb0)
at /usr/src/debug/Python-2.7.5/Python/pythonrun.c:755
#50 0x00000039a7d0eb7f in Py_Main (argc=<optimized out>, argv=<optimized out>)
at /usr/src/debug/Python-2.7.5/Modules/main.c:640
#51 0x0000003a7ee21d65 in __libc_start_main (main=0x4006f0 <main>, argc=2,
argv=0x7fffffffe078, init=<optimized out>, fini=<optimized out>,
rtld_fini=<optimized out>, stack_end=0x7fffffffe068) at libc-start.c:285
#52 0x0000000000400721 in _start ()

# Fixed code
def _onKeyDown(self, evt):
    """Capture key press."""
    key = self._get_key(evt)
    FigureCanvasBase.key_press_event(self, key, guiEvent=evt)
    if self:
        evt.Skip()