如何解决程序退出时出现段错误 (-11)
我正在尝试让 goocanvasmm
从 C++ 程序中工作。从一对
我结合了代码片段并让程序绘制的地方。
但是,在程序终止时,会出现段错误。我不是普通的 C++
用户,
因此,gdb
消息对我来说有些神秘。
这是代码。它创建一个窗口,并在其中绘制一个 200x200 像素的黄色方块:
#include <gtkmm.h>
#include <goocanvasmm.h>
#include <iostream>
#define UI_FILE "gtk_foobar.ui"
int
main (int argc,char *argv[]) {
Gtk::Main kit(argc,argv);
//Load the Glade file and instiate its widgets:
Glib::RefPtr<Gtk::Builder> builder;
try {
builder = Gtk::Builder::create_from_file(UI_FILE);
}
catch (const Glib::FileError & ex) {
std::cerr << ex.what() << std::endl;
return 1;
}
Gtk::Window *main_win = 0;
builder->get_widget("main_window",main_win);
Goocanvas::Canvas canvas;
main_win->add(canvas);
auto root = (canvas).get_root_item();
auto rect = Goocanvas::Rect::create(100,100,200,200);
rect->property_stroke_color() = "yellow";
rect->property_line_width() = 3;
root->add_child(rect);
main_win->show_all();
if (main_win) {
kit.run(*main_win);
}
return 0;
}
运行时错误消息(在程序终止时显示):
Program has been terminated receiving signal 11 (Segmentation fault)
和 gdb
回溯:
#0 0x00007ffff5ae7d6c in free () at /lib64/libc.so.6
#1 0x00007ffff5a97736 in __cxa_finalize () at /lib64/libc.so.6
#2 0x00007ffff7d22946 in __do_global_dtors_aux () at /usr/lib64/libgoocanvasmm-2.0.so.6
#3 0x00007ffff7ffd060 in _rtld_local () at /lib64/ld-linux-x86-64.so.2
#4 0x0000000000000000 in ()
如果我没记错的话,这似乎表明析构函数有问题
libgoocanvasmm
。
编辑:我意识到(有点晚),要运行应用程序,还需要拥有 UIFILE
。这是(“gtk_foobar.ui”):
<?xml version="1.0"?>
<interface>
<!-- interface-naming-policy project-wide -->
<!-- interface-requires gtk+ 3.0 -->
<object class="GtkWindow" id="main_window">
<property name="visible">True</property>
<property name="title" translatable="yes">Hello World!</property>
<property name="default_width">500</property>
<property name="default_height">400</property>
<child>
<placeholder/>
</child>
</object>
</interface>
为了简化操作,this link 将下载完整的 autotools
项目。
解决方法
感谢@BobMorane 测试了程序并发现库之间存在较小的版本差异。看起来我和他的源包都被标记为 2.0.6,但内部有一个细微的差别,1.90.9 和 1.90.11,这很重要。
用1.90.11版本重新编译解决问题!
检查更新日志没有发现令人震惊的差异,但有一系列小的兼容性更新。重新运行 valgrind 确实显示此消息消失:
<a href="" class="play">
<svg width="252" height="188" viewBox="0 0 252 188" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M118.765 118.031a2.945 2.945 0 01-2.942-2.942V72.912a2.944 2.944 0 014.827-2.261l25.306 21.089a2.943 2.943 0 010 4.52L120.65 117.35a2.945 2.945 0 01-1.885.682zm2.944-38.837v29.612L139.476 94l-17.767-14.806z" fill="#000"/>
<path class="circle" d="M125.913 144a49.728 49.728 0 01-24.437-6.386 2.942 2.942 0 112.887-5.128c17.169 9.664 38.901 6.676 52.847-7.276 17.21-17.209 17.21-45.21 0-62.419-17.209-17.212-45.212-17.21-62.42 0-17.21 17.21-17.21 45.21 0 62.419a2.944 2.944 0 01-4.162 4.163c-19.503-19.505-19.503-51.24 0-70.744 19.505-19.503 51.238-19.504 70.745 0 19.504 19.505 19.504 51.239 0 70.744-9.608 9.608-22.476 14.627-35.46 14.627z" fill="#FDB500"/></svg>
</a>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。