Raymond Ko wrote:
> On Thursday, August 13, 2015 at 5:16:54 PM UTC-4, Dominique Pelle wrote:
> > Christian Brabandt wrote:
> >
> > > Hi Travis!
> > >
> > > On Mi, 12 Aug 2015, Travis Lebsock wrote:
> > >
> > >> I can reproduce the error without any plugins now.
> > >>
> > >> 1. I run the following command in cmd.
> > >>
> > >> gvim -u NONE -N -c:"set beval bexpr='foo'"
> > >>
> > >> 2. Insert some text then hit esc.
> > >> 3. Hover mouse over the text.
> > >> 4. Once foo bubble shows up I click
> > >> 5. Then it crashes
> > >
> > > Hm, I don't know much about Windows Programming. Debugger shows, an
> > > exception is thrown on a WM_LBUTTONDOWN message at gui_win48.c:1951
> > > after the call to DispatchMessage()
> > >
> > > ,----
> > > | 1948 if (vk != VK_F10 || check_map(k10, State, FALSE, TRUE, FALSE,
> > > | 1949 NULL,
> > > NULL) == NULL)
> > > | 1950 #endif
> > > | 1951 pDispatchMessage(&msg);
> > > | 1952 }
> > > `----
> > >
> > > I don't remember Windows Programming much, so I can't say, what the
> > > proper fix would need to be.
> > >
> > > Perhaps someone more knowledgeable than I can analyze this further.
> >
> >
> > I don't have Windows and I'm also not knowledgeable about Windows.
> > Maybe someone could build Vim for Windows with those tools
> > to chase memory errors:
> >
> > http://www.drmemory.org/
> > https://code.google.com/p/address-sanitizer/wiki/WindowsPort
> >
> > It may help for this issues and other Windows specific issues.
> >
> > Regards
> > Dominique
>
> I had some time so I took a look at it and I think I have a solution.
>
> The stack trace was pretty scary, as the actual crash was crashing in
> comctl32.dll code:
>
> comctl32.dll!CToolTipsMgr::GetToolAtPoint() Unknown
> comctl32.dll!CToolTipsMgr::ToolAtMessagePos(void) Unknown
> comctl32.dll!CToolTipsMgr::ShowVirtualBubble(void) Unknown
> comctl32.dll!CToolTipsMgr::HandleRelayedMessage() Unknown
> comctl32.dll!CToolTipsMgr::ToolTipsWndProc(struct HWND__ *,unsigned
> int,unsigned __int64,__int64) Unknown
> comctl32.dll!CToolTipsMgr::s_ToolTipsWndProc() Unknown
> user32.dll!UserCallWinProcCheckWow() Unknown
> user32.dll!SendMessageWorker() Unknown
> user32.dll!SendMessageW() Unknown
> comctl32.dll!CallNextSubclassProc () Unknown
> comctl32.dll!MasterSubclassProc() Unknown
> user32.dll!UserCallWinProcCheckWow() Unknown
> user32.dll!DispatchMessageWorker() Unknown
> > gvimd.exe!process_message() Line 1949 C
> gvimd.exe!gui_mch_wait_for_chars(int wtime) Line 2032 C
> gvimd.exe!gui_wait_for_chars(long wtime) Line 2906 C
> gvimd.exe!ui_inchar(unsigned char * buf, int maxlen, long wtime, int
> tb_change_cnt) Line 190 C
> gvimd.exe!inchar(unsigned char * buf, int maxlen, long wait_time, int
> tb_change_cnt) Line 3099 C
> gvimd.exe!vgetorpeek(int advance) Line 2874 C
> gvimd.exe!vgetc(...) Line 1638 C
> gvimd.exe!safe_vgetc(...) Line 1843 C
> gvimd.exe!normal_cmd(oparg_S * oap, int toplevel) Line 641 C
> gvimd.exe!main_loop(int cmdwin, int noexmode) Line 1352 C
> gvimd.exe!VimMain(...) Line 1052 C
> gvimd.exe!WinMain(HINSTANCE__ * hInstance, HINSTANCE__ * hPrevInst,
> char * lpszCmdLine, int nCmdShow) Line 131 C
>
> My assumption from looking at this is that isn't a C error, but a logical
> error of window resource use after free. I assumed that the click caused the
> crash because the internal comctl32.dll code was using it after a user
> callback (Handle_WM_Notify in gui_w32.c) had deleted it (via delete_tooltip).
> To test this assumption, I commented out, the DestroyWindow() call in
> delete_tooltip. This successfully avoids the crash, but now we have a
> resource leak of windows. I can confirm this by hovering and unhovering
> around 20 times, and you start to see a lot of shadowing and lag caused by
> the stacking windows.
>
> So, looking at the documentation for DestroyWindow() is equivalent to
> SendMessage of WM_DESTROY and WM_NCDESTROY. Since SendMessage is synchronous,
> like DestroyWindow() this probably caused the crash. So, I thought of
> deferring via PostMessage, which adds the window destroy commands to the
> bottom of the message queue, which hopefully will be processed after whatever
> magic comctl32.dll code has ran.
>
> I tried it, and luckily it worked. After hovering around 20 times, I did not
> notice shadowing indicating a resource leak of windows, and could no longer
> get it crash.
>
> Here is the patch:
Good detective work! I'll include the patch, hopefully that fixes the
problem for good. Perhaps we can add a comment about why this
PostMessage is used.
--
CONCORDE: Quickly, sir, come this way!
LAUNCELOT: No! It's not right for my idiom. I must escape more ... more ...
CONCORDE: Dramatically, sir?
LAUNCELOT: Dramatically.
"Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
/// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.