I built the emacs packages myself with debugging information. The crash happens at fringe.c:1214
(gdb) r
Program received signal SIGFPE, Arithmetic exception.
0x08126361 in compute_fringe_widths (f=0x85d8d00, redraw=1) at fringe.c:1214
(gdb) bt
#0 0x08126361 in compute_fringe_widths (f=0x85d8d00, redraw=1) at fringe.c:1214
#1 0x081094ed in x_new_font (f=0x85d8d00, font_object=141700660, fontset=2) at xterm.c:8372
#2 0x08064ce9 in x_set_font (f=0x85d8d00, arg=141729051, oldval=138348745) at frame.c:3445
#3 0x08063a3b in x_set_frame_parameters (f=0x85d8d00, alist=138348745) at frame.c:3017
#4 0x080662b3 in x_default_parameter (f=0x85d8d00, alist=139436189, prop=138561249, deflt=141700660, xprop=0x825029a "font", xclass=0x8250295 "Font", type=RES_TYPE_STRING) at frame.c:4130
#5 0x08113b6b in x_default_font_parameter (f=0x85d8d00, parms=139436189) at xfns.c:3043
#6 0x0811444c in Fx_create_frame (parms=139436189) at xfns.c:3257
#7 0x081cc469 in Ffuncall (nargs=2, args=0xbfffe510) at eval.c:3045
#8 0x08209371 in Fbyte_code (bytestr=136975739, vector=136975756, maxdepth=40) at bytecode.c:678
(..)
The code there is
(gdb) l
1209 {
1210 int left_wid = left_fringe_width >= 0 ? left_fringe_width : -left_fringe_width;
1211 int right_wid = right_fringe_width >= 0 ? right_fringe_width : -right_fringe_width;
1212 int conf_wid = left_wid + right_wid;
1213 int font_wid = FRAME_COLUMN_WIDTH (f);
1214 int cols = (left_wid + right_wid + font_wid-1) / font_wid;
1215 int real_wid = cols * font_wid;
1216 if (left_wid && right_wid)
1217 {
1218 if (left_fringe_width < 0)
A division by zero occurs because font_wid is 0.
(gdb) p font_wid
$3 = 0
(gdb) p left_wid
$4 = 8
(gdb) p right_wid
$5 = 8
font_wid is calculated using FRAME_COLUMN_WIDTH, which is defined in frame.h, 868:
#define FRAME_COLUMN_WIDTH(F) ((F)->column_width)
172 +static void
173 +apply_xft_settings (dpyinfo, send_event_p)
174 + struct x_display_info *dpyinfo;
175 + int send_event_p;
176 +{
177 + double dpi;
178 + if (!read_xft_dpi (dpyinfo, &dpi))
179 + return;
180 +
181 + /* Change the DPI on this display and all frames on the display. */
182 + Lisp_Object frame, tail;
183 + dpyinfo->resy = dpyinfo->resx = dpi;
184 + FOR_EACH_FRAME (tail, frame)
185 + if (FRAME_X_P (XFRAME (frame))
186 + && FRAME_X_DISPLAY_INFO (XFRAME (frame)) == dpyinfo)
187 + XFRAME (frame)->resy = XFRAME (frame)->resx = dpi;
188 +}
It seems that on LXDE, a dpi value of 0 is returned, which is then set to the frame's resy and resx properties and later propagates to column_width. If I catch this case, emacs runs again:
@@ -177,6 +177,8 @@
+ double dpi;
+ if (!read_xft_dpi (dpyinfo, &dpi))
+ return;
++ if (dpi == 0.0)
++ return;
+
+ /* Change the DPI on this display and all frames on the display. */
+ Lisp_Object frame, tail;
I built the emacs packages myself with debugging information. The crash happens at fringe.c:1214
(gdb) r fringe_ widths (f=0x85d8d00, redraw=1) at fringe.c:1214 fringe_ widths (f=0x85d8d00, redraw=1) at fringe.c:1214 141700660, fontset=2) at xterm.c:8372 parameters (f=0x85d8d00, alist=138348745) at frame.c:3017 TYPE_STRING) at frame.c:4130 font_parameter (f=0x85d8d00, parms=139436189) at xfns.c:3043
Program received signal SIGFPE, Arithmetic exception.
0x08126361 in compute_
(gdb) bt
#0 0x08126361 in compute_
#1 0x081094ed in x_new_font (f=0x85d8d00, font_object=
#2 0x08064ce9 in x_set_font (f=0x85d8d00, arg=141729051, oldval=138348745) at frame.c:3445
#3 0x08063a3b in x_set_frame_
#4 0x080662b3 in x_default_parameter (f=0x85d8d00, alist=139436189, prop=138561249, deflt=141700660, xprop=0x825029a "font", xclass=0x8250295 "Font", type=RES_
#5 0x08113b6b in x_default_
#6 0x0811444c in Fx_create_frame (parms=139436189) at xfns.c:3257
#7 0x081cc469 in Ffuncall (nargs=2, args=0xbfffe510) at eval.c:3045
#8 0x08209371 in Fbyte_code (bytestr=136975739, vector=136975756, maxdepth=40) at bytecode.c:678
(..)
The code there is
(gdb) l fringe_ width;
1209 {
1210 int left_wid = left_fringe_width >= 0 ? left_fringe_width : -left_fringe_width;
1211 int right_wid = right_fringe_width >= 0 ? right_fringe_width : -right_
1212 int conf_wid = left_wid + right_wid;
1213 int font_wid = FRAME_COLUMN_WIDTH (f);
1214 int cols = (left_wid + right_wid + font_wid-1) / font_wid;
1215 int real_wid = cols * font_wid;
1216 if (left_wid && right_wid)
1217 {
1218 if (left_fringe_width < 0)
A division by zero occurs because font_wid is 0.
(gdb) p font_wid
$3 = 0
(gdb) p left_wid
$4 = 8
(gdb) p right_wid
$5 = 8
font_wid is calculated using FRAME_COLUMN_WIDTH, which is defined in frame.h, 868: WIDTH(F) ((F)->column_width)
#define FRAME_COLUMN_
(gdb) p *f scroll_ bars = 138348745, menu_bar_items = 138348745, face_alist = 138348745, menu_bar_vector = 138348745, buffer_predicate = 138348745, buffer_list = 139434141, buried_buffer_list = 138348745, menu_bar_window = 138348745, tool_bar_window = 138348745, tool_bar_items = 138348745, desired_ tool_bar_ string = 138348745, current_ tool_bar_ string = 138348745, face_cache = 0x0, menu_bar_items_used = 0, namebuf = 0x0, current_pool = 0x0, desired_pool = 0x0, desired_matrix = 0x0, current_matrix = 0x0, glyphs_ initialized_ p = 0, resized_p = 0, force_flush_ display_ p = 0, default_face_done_p = 0, already_hscrolled_p = 0, updated_p = 0, minimize_ tool_bar_ window_ p = 0, tool_bar_lines = 0, n_tool_bar_rows = 0, n_tool_bar_items = 0, decode_ mode_spec_ buffer = 0x0, insert_line_cost = 0x0, delete_line_cost = 0x0, insert_n_lines_cost = 0x0, delete_n_lines_cost = 0x0, text_lines = 10, text_cols = 10, total_lines = 0, total_cols = 10, new_text_lines = 0, new_text_cols = 0, left_pos = 0, top_pos = 0, pixel_height = 0, pixel_width = 0, resx = 0, resy = 0, x_pixels_diff = 0, y_pixels_diff = 0, win_gravity = 0, size_hint_flags = 0, border_width = 0, internal_ border_ width = 0, column_width = 0, space_width = 0, line_height = 0, output_method = output_x_window, terminal = 0x85f08c0, output_data = {tty = 0x8602a90, x = 0x8602a90, w32 = 0x8602a90, ns = 0x8602a90, nothing = 140520080}, font_driver_list = 0x86684b8, font_data_list = 0x0, fringe_cols = 0, left_fringe_width = 0, right_fringe_width = 0, want_fullscreen = FULLSCREEN_NONE, menu_bar_lines = 0, external_menu_bar = 0, display_preempted = 0 '\000', visible = 0 '\000', iconified = 0 '\000', async_visible = 0 '\000', async_iconified = 0 '\000', garbaged = 1 '\001', has_minibuffer = 1 '\001', wants_modeline = 1 '\001', can_have_ scroll_ bars = 1 '\001', auto_raise = 0 '\000', auto_lower = 0 '\000', no_split = 0 '\000', explicit_name = 0 '\000', window_ sizes_changed = 0 '\000', mouse_moved = 0 '\000', vertical_ scroll_ bar_type = vertical_ scroll_ bar_none, desired_cursor = FILLED_BOX_CURSOR, cursor_width = 0, blink_off_cursor = FILLED_BOX_CURSOR, blink_off_ cursor_ width = 0, message_buf = 0x0, scroll_bottom_vpos = 0, config_ scroll_ bar_width = 0, config_ scroll_ bar_cols = 0, scroll_ bar_actual_ width = 0, cost_calculatio n_baud_ rate = 0, alpha = {0, 0}, gamma = 0, extra_line_spacing = 0, background_pixel = 0, foreground_pixel = 0}
$1 = {size = 1073742869, next = 0x85be378, name = 141729355, icon_name = 138348745, title = 138348745, focus_frame = 138348745, root_window = 140609412, selected_window = 140609412, minibuffer_window = 140104924, param_alist = 139429197, scroll_bars = 138348745, condemned_
If I start the debugger from a KDE session there are different values:
Breakpoint 1, compute_ fringe_ widths (f=0x8580f90, redraw=1) at fringe.c:1214
(gdb) p font_wid
$1 = 10
(gdb) p left_wid
$2 = 8
(gdb) p right_wid
$3 = 8
Interesting differences in the frame struct are:
LXDE: resx = 0, resy = 0, column_width = 0, space_width = 0, line_height = 0
KDE : resx = 93.068702290076331, resy = 94.953271028037378, column_width = 10, space_width = 10, line_height = 20
The patch which might cause this bug is http:// bazaar. launchpad. net/~ubuntu- branches/ ubuntu/ lucid/emacs23/ lucid-proposed/ revision/ 13, and there is a debian/ patches/ fix-huge- fonts.diff which modifies these frame fields:
172 +static void DISPLAY_ INFO (XFRAME (frame)) == dpyinfo)
173 +apply_xft_settings (dpyinfo, send_event_p)
174 + struct x_display_info *dpyinfo;
175 + int send_event_p;
176 +{
177 + double dpi;
178 + if (!read_xft_dpi (dpyinfo, &dpi))
179 + return;
180 +
181 + /* Change the DPI on this display and all frames on the display. */
182 + Lisp_Object frame, tail;
183 + dpyinfo->resy = dpyinfo->resx = dpi;
184 + FOR_EACH_FRAME (tail, frame)
185 + if (FRAME_X_P (XFRAME (frame))
186 + && FRAME_X_
187 + XFRAME (frame)->resy = XFRAME (frame)->resx = dpi;
188 +}
It seems that on LXDE, a dpi value of 0 is returned, which is then set to the frame's resy and resx properties and later propagates to column_width. If I catch this case, emacs runs again:
--- debian/ patches/ fix-huge- fonts.diff. orig 2011-02-25 09:27:38.900821363 +0100 patches/ fix-huge- fonts.diff 2011-02-25 08:00:53.469874683 +0100
+++ debian/
@@ -16,7 +16,7 @@
#ifdef USE_LUCID
extern int xlwmenu_window_p P_ ((Widget w, Window window));
extern void xlwmenu_redisplay P_ ((Widget));
-@@ -5829,6 +5832,237 @@ event_handler_gdk (gxev, ev, data)
+@@ -5829,6 +5832,239 @@ event_handler_gdk (gxev, ev, data)
}
#endif /* USE_GTK */
@@ -177,6 +177,8 @@
+ double dpi;
+ if (!read_xft_dpi (dpyinfo, &dpi))
+ return;
++ if (dpi == 0.0)
++ return;
+
+ /* Change the DPI on this display and all frames on the display. */
+ Lisp_Object frame, tail;
Regards,
Urs