#include <stdio.h> main() { char cc = 'z'; printf("cc=%c", cc); // STOP HERE return 0; } Stop in the provided sample: (gdb) print cc $1 = 122 '<error reading variable> Reproduced on Solaris 10 and OpenSolaris
This has to do with Tom's charset changes. The error comes from: #0 error (string=0x834d468 "%s.") at ../../src/gdb/utils.c:814 #1 0x080d5c33 in perror_with_name ( string=0x8373763 "Converting character sets") at ../../src/gdb/utils.c:1147 #2 0x0815aa33 in make_wchar_iterator (input=0x80470c0 "z9W\b\001", bytes=1, charset=0xfe65b0d0 "UTF-8", width=1) at ../../src/gdb/charset.c:542 #3 0x0821370a in c_emit_char (c=122, type=0x8573988, stream=0x852e388, quoter=39) at ../../src/gdb/c-lang.c:272 #4 0x08213a1d in c_printchar (c=122, type=0x8573988, stream=0x852e388) at ../../src/gdb/c-lang.c:360 #5 0x08235ea8 in c_val_print (type=0x8573988, valaddr=0x85a8918 "z�U\b", embedded_offset=0, address=134511147, stream=0x852e388, recurse=0, options=0x8047370) at ../../src/gdb/c-valprint.c:497 #6 0x081739c7 in val_print (type=0x8573988, valaddr=0x85a8918 "z�U\b", embedded_offset=0, address=134511147, stream=0x852e388, recurse=0, options=0x8047430, language=0x83a7dc0) at ../../src/gdb/valprint.c:309 #7 0x082365e9 in c_value_print (val=0x85f3558, stream=0x852e388, options=0x8047510) at ../../src/gdb/c-valprint.c:711 #8 0x08173bf1 in value_print (val=0x85f3558, stream=0x852e388, options=0x8047510) at ../../src/gdb/valprint.c:393 #9 0x08175ef3 in print_formatted (val=0x85f3558, size=0, options=0x8047510, stream=0x852e388) at ../../src/gdb/printcmd.c:319 #10 0x08177156 in print_command_1 (exp=0x8449dea "cc", inspect=0, voidprint=1) at ../../src/gdb/printcmd.c:958 Possible workaround: install GNU libiconv into the build tree.
The first problem appears to be that iconv_open("wchar_t", "UTF-8") fails. Here are the relevant ICONV settings from config.h: $ egrep 'ICONV|WCHAR|BTOWC' config.h #define BITSIZEOF_WCHAR_T 32 #define HAVE_BTOWC 1 #define HAVE_ICONV 1 /* #undef HAVE_ICONVLIST */ /* #undef HAVE_LIBICONVLIST */ #define HAVE_SIGNED_WCHAR_T 1 #define HAVE_WCHAR_H 1 #define ICONV_CONST const #define WCHAR_T_SUFFIX l The second problem is that 'iconv -l' outputs this: $ iconv -l The following are all supported code set names. All combinations of those names are not necessarily available for the pair of the fromcode-tocode. Some of those code set names have aliases, which are case-insensitive and described in parentheses following the canonical name: 646 (ASCII, US-ASCII, US_ASCII, USASCII), 646da, 646de, 646en, 646es, 646fr, 646it, 646sv, 8859, 8859-1 (ISO8859-1, ISO-8859-1, ISO8859_1, ISO_8859_1), This results in bizarre tab completion for 'set charset ...': (gdb) set charset <TAB> All combinations not Some described of The following pair aliases, for parentheses all fromcode-tocode. set and have supported are in the available name: those canonical names which case-insensitive names. code necessarily and inability to set charset to anything reasonable: (gdb) set charset UTF-8 Undefined item: "UTF-8".
> The first problem appears to be that iconv_open("wchar_t", "UTF-8") fails. This was discussed on the list, though it never resulted in a working patch. I think we should completely disable the iconv stuff for solaris. It might work with libiconv, I am not sure, but even if so, if there is no libiconv we must fall back on nothing -- the solaris iconv is unusable by gdb.
*** Bug 11519 has been marked as a duplicate of this bug. ***
Subject: Re: error reading variable for char variable I've just asked the OpenSolaris i18n mailing list for advise: http://mail.opensolaris.org/pipermail/i18n-discuss/2010-April/003140.html While there's a project to fix this issue, the current recommendation was to disable iconv support. I've tried your patch on i386-pc-solaris2.11 and it works just fine, so I'd really like to get this in until Solaris can properly handle iconv. Thanks. Rainer
I couldn't find an option to disable iconv, but this worked for me: am_cv_func_iconv=no ./configure Note that it isn't "./configure am_cv_func_iconv=no", because the configure script in root dir doesn't pass am_cv_func_iconv to the configure script in gdb dir.
I put in a fix a while back that disables the use of iconv on many systems, including Solaris. The change will appear in gdb 7.3. One thing that would be useful in the future is to know how to write a test to see whether a newer Solaris has a working iconv. Ideally, this test would not require running a test program. For glibc this is easy because it defines __STDC_ISO_10646__, but from the referenced thread I gather that this will never be the case on Solaris.