gdbserver crash when running 32bits exes on x64 Windows.
* inferiors.c (find_inferior): Add function documentation. (unloaded_dll): Handle the case where the unloaded dll has not been previously registered in the dll list.
This commit is contained in:
parent
546c74577f
commit
0718675c76
2 changed files with 29 additions and 3 deletions
|
@ -1,3 +1,10 @@
|
|||
2010-02-02 Nicolas Roche <roche@sourceware.org>
|
||||
Joel Brobecker <brobecker@adacore.com>
|
||||
|
||||
* inferiors.c (find_inferior): Add function documentation.
|
||||
(unloaded_dll): Handle the case where the unloaded dll has not
|
||||
been previously registered in the dll list.
|
||||
|
||||
2010-02-01 Daniel Jacobowitz <dan@codesourcery.com>
|
||||
|
||||
* linux-arm-low.c (thumb_breakpoint_len): Delete.
|
||||
|
|
|
@ -249,6 +249,9 @@ remove_thread (struct thread_info *thread)
|
|||
free_one_thread (&thread->entry);
|
||||
}
|
||||
|
||||
/* Find the first inferior_list_entry E in LIST for which FUNC (E, ARG)
|
||||
returns non-zero. If no entry is found then return NULL. */
|
||||
|
||||
struct inferior_list_entry *
|
||||
find_inferior (struct inferior_list *list,
|
||||
int (*func) (struct inferior_list_entry *, void *), void *arg)
|
||||
|
@ -366,9 +369,25 @@ unloaded_dll (const char *name, CORE_ADDR base_addr)
|
|||
key_dll.base_addr = base_addr;
|
||||
|
||||
dll = (void *) find_inferior (&all_dlls, match_dll, &key_dll);
|
||||
remove_inferior (&all_dlls, &dll->entry);
|
||||
free_one_dll (&dll->entry);
|
||||
dlls_changed = 1;
|
||||
|
||||
if (dll == NULL)
|
||||
/* For some inferiors we might get unloaded_dll events without having
|
||||
a corresponding loaded_dll. In that case, the dll cannot be found
|
||||
in ALL_DLL, and there is nothing further for us to do.
|
||||
|
||||
This has been observed when running 32bit executables on Windows64
|
||||
(i.e. through WOW64, the interface between the 32bits and 64bits
|
||||
worlds). In that case, the inferior always does some strange
|
||||
unloading of unnamed dll. */
|
||||
return;
|
||||
else
|
||||
{
|
||||
/* DLL has been found so remove the entry and free associated
|
||||
resources. */
|
||||
remove_inferior (&all_dlls, &dll->entry);
|
||||
free_one_dll (&dll->entry);
|
||||
dlls_changed = 1;
|
||||
}
|
||||
}
|
||||
|
||||
#define clear_list(LIST) \
|
||||
|
|
Loading…
Reference in a new issue