libwine: Add public symbol to access list of debug options.

Sebastian Lackner sebastian at fds-team.de
Sun Oct 9 11:56:29 CDT 2016


Signed-off-by: Sebastian Lackner <sebastian at fds-team.de>
---

Fixes https://bugs.winehq.org/show_bug.cgi?id=41457.

Currently, the "edit debug channels" feature of taskmgr is broken in
release builds, because:

* "debug_options" is not exported as a public symbol
* taskmgr passes SYMOPT_PUBLICS_ONLY to SymSetOptions

This combination does not make any sense (not even installing debug
packages is sufficient). This patch replaces debug_options with
__wine_dbg_options and makes it a public symbol.

 libs/wine/debug.c          |   24 ++++++++++++------------
 libs/wine/wine.def         |    1 +
 libs/wine/wine.map         |    1 +
 programs/taskmgr/dbgchnl.c |    2 +-
 programs/winedbg/info.c    |    2 +-
 5 files changed, 16 insertions(+), 14 deletions(-)

diff --git a/libs/wine/debug.c b/libs/wine/debug.c
index 8b04ef9..b26dd52 100644
--- a/libs/wine/debug.c
+++ b/libs/wine/debug.c
@@ -44,7 +44,7 @@ static const char * const debug_classes[] = { "fixme", "err", "warn", "trace" };
 
 static unsigned char default_flags = (1 << __WINE_DBCL_ERR) | (1 << __WINE_DBCL_FIXME);
 static int nb_debug_options = -1;
-static struct __wine_debug_channel debug_options[MAX_DEBUG_OPTIONS];
+struct __wine_debug_channel __wine_dbg_options[MAX_DEBUG_OPTIONS];
 
 static struct __wine_debug_functions funcs;
 
@@ -64,8 +64,8 @@ unsigned char __wine_dbg_get_channel_flags( struct __wine_debug_channel *channel
 
     if (nb_debug_options)
     {
-        struct __wine_debug_channel *opt = bsearch( channel->name, debug_options, nb_debug_options,
-                                                    sizeof(debug_options[0]), cmp_name );
+        struct __wine_debug_channel *opt = bsearch( channel->name, __wine_dbg_options, nb_debug_options,
+                                                    sizeof(__wine_dbg_options[0]), cmp_name );
         if (opt) return opt->flags;
     }
     /* no option for this channel */
@@ -81,8 +81,8 @@ int __wine_dbg_set_channel_flags( struct __wine_debug_channel *channel,
 
     if (nb_debug_options)
     {
-        struct __wine_debug_channel *opt = bsearch( channel->name, debug_options, nb_debug_options,
-                                                    sizeof(debug_options[0]), cmp_name );
+        struct __wine_debug_channel *opt = bsearch( channel->name, __wine_dbg_options, nb_debug_options,
+                                                    sizeof(__wine_dbg_options[0]), cmp_name );
         if (opt)
         {
             opt->flags = (opt->flags & ~clear) | set;
@@ -102,15 +102,15 @@ static void add_option( const char *name, unsigned char set, unsigned char clear
         default_flags = (default_flags & ~clear) | set;
         return;
     }
-    if (strlen(name) >= sizeof(debug_options[0].name)) return;
+    if (strlen(name) >= sizeof(__wine_dbg_options[0].name)) return;
 
     while (min <= max)
     {
         pos = (min + max) / 2;
-        res = strcmp( name, debug_options[pos].name );
+        res = strcmp( name, __wine_dbg_options[pos].name );
         if (!res)
         {
-            debug_options[pos].flags = (debug_options[pos].flags & ~clear) | set;
+            __wine_dbg_options[pos].flags = (__wine_dbg_options[pos].flags & ~clear) | set;
             return;
         }
         if (res < 0) max = pos - 1;
@@ -119,10 +119,10 @@ static void add_option( const char *name, unsigned char set, unsigned char clear
     if (nb_debug_options >= MAX_DEBUG_OPTIONS) return;
 
     pos = min;
-    if (pos < nb_debug_options) memmove( &debug_options[pos + 1], &debug_options[pos],
-                                         (nb_debug_options - pos) * sizeof(debug_options[0]) );
-    strcpy( debug_options[pos].name, name );
-    debug_options[pos].flags = (default_flags & ~clear) | set;
+    if (pos < nb_debug_options) memmove( &__wine_dbg_options[pos + 1], &__wine_dbg_options[pos],
+                                         (nb_debug_options - pos) * sizeof(__wine_dbg_options[0]) );
+    strcpy( __wine_dbg_options[pos].name, name );
+    __wine_dbg_options[pos].flags = (default_flags & ~clear) | set;
     nb_debug_options++;
 }
 
diff --git a/libs/wine/wine.def b/libs/wine/wine.def
index ed315bd..c08c83b 100644
--- a/libs/wine/wine.def
+++ b/libs/wine/wine.def
@@ -2,6 +2,7 @@ LIBRARY libwine.dll
 
 EXPORTS
     __wine_dbg_get_channel_flags
+    __wine_dbg_options
     __wine_dbg_set_channel_flags
     __wine_dbg_set_functions
     __wine_dll_register
diff --git a/libs/wine/wine.map b/libs/wine/wine.map
index 2159fac..f44c66f 100644
--- a/libs/wine/wine.map
+++ b/libs/wine/wine.map
@@ -2,6 +2,7 @@ WINE_1.0
 {
   global:
     __wine_dbg_get_channel_flags;
+    __wine_dbg_options;
     __wine_dbg_set_channel_flags;
     __wine_dbg_set_functions;
     __wine_dll_register;
diff --git a/programs/taskmgr/dbgchnl.c b/programs/taskmgr/dbgchnl.c
index 6e2dea0..da9a078 100644
--- a/programs/taskmgr/dbgchnl.c
+++ b/programs/taskmgr/dbgchnl.c
@@ -196,7 +196,7 @@ static int enum_channel(HANDLE hProcess, EnumChannelCB ce, void* user)
     int                         ret = 1;
     void*                       addr;
 
-    if (!(addr = get_symbol(hProcess, "libwine.so.1!debug_options"))) return -1;
+    if (!(addr = get_symbol(hProcess, "libwine.so.1!__wine_dbg_options"))) return -1;
 
     while (ret && addr && ReadProcessMemory(hProcess, addr, &channel, sizeof(channel), NULL))
     {
diff --git a/programs/winedbg/info.c b/programs/winedbg/info.c
index e521252..33c7873 100644
--- a/programs/winedbg/info.c
+++ b/programs/winedbg/info.c
@@ -796,7 +796,7 @@ void info_wine_dbg_channel(BOOL turn_on, const char* cls, const char* name)
         return;
     }
 
-    if (symbol_get_lvalue("debug_options", -1, &lvalue, FALSE) != sglv_found)
+    if (symbol_get_lvalue("__wine_dbg_options", -1, &lvalue, FALSE) != sglv_found)
     {
         return;
     }
-- 
2.9.0



More information about the wine-patches mailing list