Ticket #141 (assigned 不具合)

Opened 3 years ago

Last modified 2 years ago

rev3833 xdisp.cで落ちる

Reported by: anonymous Assigned to: (accepted)
Priority: minor Milestone:
Component: その他/一般 Version: 3.00 (開発中)
Keywords: Cc:

Description

rev3833 xdisp.cで落ちる場合があります。下記が呼び出し履歴です。 (使っているうちにいつの間にか落ちてしまうため、再現方法はよく分かりません。)

Meadow.exe!show_mouse_face(mw32_display_info * dpyinfo=0x01c1be00, draw_glyphs_face draw=DRAW_MOUSE_FACE) 行 21137 + 0x35 C

Meadow.exe!note_mode_line_or_margin_highlight() 行 21952 + 0xb C
Meadow.exe!note_mouse_highlight(frame * f=0x01c5c600, int x=385, int y=696) 行 22039 + 0x15 C
Meadow.exe!note_mouse_movement(frame * frame=0x01c5c600, tagMSG * msg=0x00810ba4) 行 2817 + 0x26 C
Meadow.exe!note_sync_event() 行 4046 + 0xe C
Meadow.exe!gobble_input(int expected=0) 行 6750 C
Meadow.exe!get_input_pending(int * addr=0x0084304c, int flags=1) 行 6735 + 0x7 C
Meadow.exe!detect_input_pending_run_timers(int do_display=1) 行 10126 + 0xc C
Meadow.exe!wait_reading_process_output(int time_limit=30, int microsecs=0, int read_kbd=-1, int do_display=1, int wait_for_cell=294360684, Lisp_Process * wait_proc=0x00000000, int just_wait_proc=0) 行 4486 + 0x9 C
Meadow.exe!sit_for(int sec=30, int usec=0, int reading=1, int display=1, int initial_display=0) 行 6441 + 0x29 C
Meadow.exe!read_char(int commandflag=1, int nmaps=3, int * maps=0x012df9c0, int prev_event=294360684, int * used_mouse_menu=0x012dfb20) 行 2783 + 0x24 C
Meadow.exe!read_key_sequence(int * keybuf=0x012dfca4, int bufsize=30, int prompt=294360684, int dont_downcase_last=0, int can_return_switch_frame=1, int fix_current_buffer=1) 行 9032 + 0x2c C
Meadow.exe!command_loop_1() 行 1543 + 0x17 C
Meadow.exe!internal_condition_case(int (void)* bfun=0x00747890, int handlers=294362892, int (int)* hfun=0x00747420) 行 1461 + 0x3 C
Meadow.exe!command_loop_2() 行 1332 + 0x15 C
Meadow.exe!internal_catch(int tag=294499620, int (int)* func=0x00747720, int arg=294360684) 行 1220 + 0x7 C
Meadow.exe!command_loop() 行 1311 + 0x17 C
Meadow.exe!recursive_edit_1() 行 1004 + 0x5 C
Meadow.exe!Frecursive_edit() 行 1066 C
Meadow.exe!main() 行 1911 C
Meadow.exe!mainCRTStartup() 行 259 + 0x12 C
Meadow.exe!mw32_start() 行 140 C
kernel32.dll!7c816d4f()
ntdll.dll!7c955b4f()
kernel32.dll!7c8399f3()

場所は、xdisp.cの21137行目(下記の->の所)で、w->current_matrixがおかしな場所を指しているようです。

if (/* If window is in the process of being destroyed, don't bother

to do anything. */

w->current_matrix != NULL
/* Don't update mouse highlight if hidden */

&& (draw != DRAW_MOUSE_FACE !dpyinfo->mouse_face_hidden)
/* Recognize when we are called to operate on rows that don't exist

anymore. This can happen when a window is split. */

-> && dpyinfo->mouse_face_end_row < w->current_matrix->nrows)

{
int phys_cursor_on_p = w->phys_cursor_on_p;

環境は、下記の通りです。 OS:Windows XP Pro Sp2 コンパイラ:Visual C++ 7

This ticket was imported from scarab issue MW129

Attachments

Change History

2005年09月06日 19時42分01秒 changed by gotoh

[by 三好]

この類の問題は解決するのがなかなか難しいのですが、スレッド間のリソー ス競合が原因かもしれません。

今度同じ現象が発生したら、

  • w->current_matrix の値
  • 他のスレッドの停止箇所

を教えてください。

2005年09月06日 19時44分42秒 changed by gotoh

[by 藤本]

# やっと落ちました。
# Rev.は3833から3847(だと思います)へ変更しています。

On Thu, 01 Sep 2005 22:55:14 +0900
miyoshi@meadowy.org( MIYOSHI Masanori) said:

w->current_matrix の値

  • current_matrix 0x118b97b8 {pool=??? rows=??? rows_allocated=??? ...} glyph_matrix * + pool CXX0030: エラーです : 式を評価できません glyph_pool * + rows CXX0030: エラーです : 式を評価できません glyph_row * rows_allocated CXX0030: エラーです : 式を評価できません int nrows CXX0030: エラーです : 式を評価できません int matrix_x CXX0030: エラーです : 式を評価できません int matrix_y CXX0030: エラーです : 式を評価できません int matrix_w CXX0030: エラーです : 式を評価できません int matrix_h CXX0030: エラーです : 式を評価できません int window_left_col CXX0030: エラーです : 式を評価できません int window_top_line CXX0030: エラーです : 式を評価できません int window_height CXX0030: エラーです : 式を評価できません int window_width CXX0030: エラーです : 式を評価できません int window_vscroll CXX0030: エラーです : 式を評価できません int left_margin_glyphs CXX0030: エラーです : 式を評価できません int right_margin_glyphs CXX0030: エラーです : 式を評価できません int no_scrolling_p CXX0030: エラーです : 式を評価できません unsigned int header_line_p CXX0030: エラーです : 式を評価できません unsigned int + method 0x118b97f8 <不適切な Ptr> char [512] + buffer CXX0030: エラーです : 式を評価できません buffer * begv CXX0030: エラーです : 式を評価できません int zv CXX0030: エラーです : 式を評価できません int

他のスレッドの停止箇所

ID 名前 場所 優先順位 中断
5060 mw32_start show_mouse_face 標準 0
4108 mw32_async_handle_message mw32_async_handle_message 標準 0
2276 Win32 スレッド 7c94eb94 最低 0
7232 reader_thread _sys_read_ahead 標準 0
7120 reader_thread _sys_read_ahead 標準 0

mw32_async_handle_messageは、mw32term.c の下記行(4758行目)です。

nread = mw32_message_loop (0, buf, KBD_BUFFER_SIZE, 0, &leftover);

reader_threadは2つともw32.cの下記行(3961行目)です。

rc = ReadFile?((HANDLE)_get_osfhandle(fd),
&cp->chr, sizeof(char), &numbytes, NULL);

以上でよろしいでしょうか? 他に調べることがあれば教えてください。

2005年09月06日 19時45分22秒 changed by gotoh

[by 三好]

だいたい様子がつかめました。

お手数ですが、Meadow が落ちたときに、show_mouse_face()@xdisp.c の dpyinfo->mouse_face_window と Qnil の値がどうなっているのか教えて もらえませんか?
;; 最初からお願いしておけばよかったですね。すみません。

dpyinfo->mouse_face_window が Qnil の時に Meadow が落ちるのではな いかと予測しています。Emacs ではこうはなりませんが、Meadow ではス レッド処理の関係でこうなってしまう可能性があります。

2005年09月06日 19時46分29秒 changed by gotoh

[by 藤本]

mouse_face_window 294361016 int
Qnil 294361016 int

となっており、ご推察の通りdpyinfo->mouse_face_window = Qnilとなっています。 (なお、mouse_face_overlayも同じ値となっていました。)

2005年09月08日 09時08分30秒 changed by gotoh

  • priority changed from major to minor.
  • status changed from new to assigned.

メインスレッドとメッセージスレッド双方が非同期で dpyinfo->mouse_face_window を変更するのが原因のようです。

きちんとした対策には時間がかかりそうなので、暫定的な対策をしておきました。(r3857)

この対策は十分なものではないかもしれません。しかし、Meadow が落ち ることはほとんどなくなると思います。


Add/Change #141 (rev3833 xdisp.cで落ちる)




Change Properties
Action