【问题标题】:Segmentation Fault? No error I’ve seen…分段故障?我没有看到任何错误...
【发布时间】:2014-05-19 01:11:30
【问题描述】:

我有这个代码:

from Tkinter import *
def get_info(key):
    pass#do more later
def create_new():
    create = Toplevel(root)
    create.title('Create A New Contact')
    Label(create, text='Name: ').grid(row=0, sticky=W+E)
    name = Entry(create, width=8).grid(row=1, sticky=W+E)
    Label(create, text='Address(ex. 1111 Main St, MyCity, Anystate 12345): ', wraplength=1).grid(row=2, sticky=W+E)
    address = Entry(create, width=8).grid(row=3, sticky=W+E)
def access():
    access_window = Toplevel(root)
    access_window.title("Access a Contact")
    Label(access_window, text="Enter a first name: ").grid(row=0, sticky=W+E)
    access_key = Entry(access_window, width=8).grid(row=1, sticky=W+E)
    Button(access_window, text="Submit", command=lambda: get_info(access_key.get('0.0', 'end-1c'))).grid(row=2, sticky=W+E)
root = Tk()
root.title('Address Book')
button1 = Button(root, text="Create New", command=create_new)
button1.grid(row=0, column=0)
button2 = Button(root, text="Access Person", command=access)
button2.grid(row=0, column=1)

此行有错误:

button2.grid(row=0, column=1)

它给了我这个错误:

Segmentation fault: 11

为什么会出现这种情况?什么是分段错误?

【问题讨论】:

  • 顺便说一下,我使用的是 Python 2.7。
  • 你用的是什么库?我的意思是,Button 类是从哪里来的?
  • 我的第一行代码:
  • from Tkinter import *
  • access 命令中有什么内容?

标签: python button error-handling tkinter


【解决方案1】:

“Segmentation fault”是一个非常低级的错误:这意味着操作系统发现您的程序正在访问一个未分配给任何实际内存的内存地址范围。

如果您使用 C 进行编程,这将表明您的代码中存在错误。但是你正在用 Python 编程。对于您在 Python 中执行的任何操作来触发分段错误,它应该是不可能的。该错误实际上不在您的代码中!不管你信不信,这个问题最可能的原因是硬件故障:特别是坏的RAM。反复运行程序至少 100 次;同时,做一些内存密集型的事情,比如加载大量图形密集的网页,然后反复关闭它们。 每次都会崩溃吗?如果没有,运行 memtest86+让它继续运行,直到它告诉你哪个 RAM 棒坏了,然后更换它。

现在,如果它每次都崩溃,那么您确实有软件问题。下一个最可能的情况是 Tkinter 附加组件与 Python 解释器、实际的 Tk 小部件库或两者不兼容。从已知良好的来源卸载并重新安装 Tk 和 Tkinter(例如,如果您正在运行 Linux,您的发行版的软件包存储库)。那应该可以解决它。

Tkinter、Tk、较低级别的窗口库之一或 Python 解释器中的完全错误的可能性很小,但仍有可能。仅当重新安装已知良好的软件包不能解决问题时才考虑这种可能性。

【讨论】:

  • 我认为硬件故障的可能性不大。 Tkinter 是一个非常复杂的库,肯定会发生错误。我认为这应该作为一个错误报告给 Python 开发人员。
  • @JamesElegan 是的,这很复杂,但是硬件问题和版本偏差都比实际错误更有可能发生。
  • @JamesElegan 不,我只是假设(根据痛苦的经验)版本偏差和硬件故障更常见
  • @thecoder16 如果不清楚:segfault 神奇地消失意味着 你的 RAM 不好。找出哪个 RAM 棒坏了,并在它对您造成更坏影响之前更换它。
  • 段错误神奇地消失的事实并不一定意味着坏 RAM 有问题。段错误经常发生在竞态条件下。
【解决方案2】:

实际上它几乎不可能是坏内存。有很多工具可以对此进行测试。此外,如果它是坏 ram,一切都会随机崩溃,而不仅仅是 tkinter。我自己正在经历。这很可能是一个错误,因为几乎没有任何软件没有它们,否则内核或任何其他软件包都不需要不断修复错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-19
    相关资源
    最近更新 更多