diff --git a/cnd.debugger.gdb/src/org/netbeans/modules/cnd/debugger/gdb/GdbDebugger.java b/cnd.debugger.gdb/src/org/netbeans/modules/cnd/debugger/gdb/GdbDebugger.java --- a/cnd.debugger.gdb/src/org/netbeans/modules/cnd/debugger/gdb/GdbDebugger.java +++ b/cnd.debugger.gdb/src/org/netbeans/modules/cnd/debugger/gdb/GdbDebugger.java @@ -47,6 +47,7 @@ import java.beans.PropertyChangeSupport; import java.io.File; import java.io.IOException; +import java.nio.charset.Charset; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -718,7 +719,7 @@ // See IZ 147931 (On Mac sometimes response is in wrong format) if (results.startsWith("threadno")) { // NOI18N for (String line : results.split("threadn")) { //NOI18N - Map map = GdbUtils.createMapFromString(line); + Map map = createMapFromString(line); if (!map.isEmpty()) { list.add(map.get("o") + " " + map.get("target_tid")); // NOI18N } @@ -930,7 +931,7 @@ while ((line = info.substring(start, next > 0 ? next : info.length())) != null) { if (line.contains(path)) { - return parseMacDylibAddress(line); + return parseMacDylibAddress(line, getCharSetEncoding()); } start = next + 12; next = info.indexOf(",shlib-info=", start); // NOI18N @@ -939,10 +940,10 @@ } - private static String parseMacDylibAddress(String line) { + private static String parseMacDylibAddress(String line, String encoding) { int pos1 = GdbUtils.findMatchingCurly(line, 0); if (pos1 != -1) { - Map map = GdbUtils.createMapFromString(line.substring(1, pos1)); + Map map = GdbUtils.createMapFromString(line.substring(1, pos1), encoding); if (map.containsKey("loaded_addr")) { // NOI18N return map.get("loaded_addr"); // NOI18N } @@ -1075,11 +1076,11 @@ if (msg.startsWith(DONE_PREFIX)) { if (msg.startsWith("^done,bkpt=")) { // NOI18N (-break-insert) msg = msg.substring(12, msg.length() - 1); - Map map = GdbUtils.createMapFromString(msg); + Map map = createMapFromString(msg); validateBreakpoint(token, map); } else if (msg.startsWith("^done,stack=")) { // NOI18N (-stack-list-frames) if (state == State.STOPPED) { // Ignore data if we've resumed running - stackUpdate(GdbUtils.createListFromString((msg.substring(13, msg.length() - 1)))); + stackUpdate(createListFromString((msg.substring(13, msg.length() - 1)))); } } else if (msg.startsWith("^done,locals=")) { // NOI18N (-stack-list-locals) if (state == State.STOPPED) { // Ignore data if we've resumed running @@ -1222,7 +1223,7 @@ if (msg.startsWith("*stopped")) { // NOI18N Map map; if (msg.length() > 9) { - map = GdbUtils.createMapFromString(msg.substring(9)); + map = createMapFromString(msg.substring(9)); } else { map = new HashMap(); } @@ -1361,10 +1362,10 @@ } private void addArgsToLocalVariables(String info) { - List frames = GdbUtils.createListFromString(info); + List frames = createListFromString(info); GdbCallStackFrame curFrame = getCurrentCallStackFrame(); for (String frame : frames) { - Map frameMap = GdbUtils.createMapFromString(frame); + Map frameMap = createMapFromString(frame); int level; try { level = Integer.parseInt(frameMap.get("level")); // NOI18N @@ -1679,7 +1680,7 @@ if (state == State.STARTING) { String frame = map.get("frame"); // NOI18N if (frame != null) { - map = GdbUtils.createMapFromString(frame); + map = createMapFromString(frame); updateLastStop(map); } setLoading(); @@ -1760,7 +1761,7 @@ } String frame = map.get("frame"); // NOI18N if (frame != null) { - map = GdbUtils.createMapFromString(frame); + map = createMapFromString(frame); updateLastStop(map); } GdbTimer.getTimer("Startup").stop("Startup1"); // NOI18N @@ -1773,7 +1774,7 @@ setStopped(); String frame = map.get("frame"); // NOI18N if (frame != null) { - map = GdbUtils.createMapFromString(frame); + map = createMapFromString(frame); updateLastStop(map); } if (GdbTimer.getTimer("Step").getSkipCount() == 0) { // NOI18N @@ -1880,7 +1881,7 @@ int next; while ((next = info.indexOf("shlib-info=", start + 1)) > 0) { // NOI18N - map = GdbUtils.createMapFromString(info.substring(start + 12, next - 2)); + map = createMapFromString(info.substring(start + 12, next - 2)); path = map.get("path"); // NOI18N addr = map.get("dyld-addr"); // NOI18N if (path != null && addr != null) { @@ -1888,7 +1889,7 @@ } start = next; } - map = GdbUtils.createMapFromString(info.substring(start + 12, info.length() - 1)); + map = createMapFromString(info.substring(start + 12, info.length() - 1)); path = map.get("path"); // NOI18N addr = map.get("dyld-addr"); // NOI18N if (path != null && addr != null) { @@ -1967,8 +1968,8 @@ boolean valid = true; boolean checkNextFrame = false; - for (String frame : GdbUtils.createListFromString(msg)) { - Map map = GdbUtils.createMapFromString(frame); + for (String frame : createListFromString(msg)) { + Map map = createMapFromString(frame); String func = map.get("func"); // NOI18N if (func != null && func.equals("dlopen") && !checkNextFrame) { // NOI18N if (platform == PlatformTypes.PLATFORM_MACOSX) { @@ -2249,7 +2250,7 @@ for (int i = 0; i < stack.size(); i++) { String line = stack.get(i); - Map map = GdbUtils.createMapFromString(line); + Map map = createMapFromString(line); String func = map.get("func"); // NOI18N String file = map.get("file"); // NOI18N @@ -2793,4 +2794,27 @@ System.out.println(" " + msg); // NOI18N } } + + private final static String remoteCharSet = System.getProperty("cnd.remote.charset", "UTF-8"); // NOI18N + public String getCharSetEncoding() { + return getCharSetEncoding(this.execEnv); + } + + public static String getCharSetEncoding(ExecutionEnvironment execEnv) { + String encoding; + if (execEnv.isRemote()) { + encoding = remoteCharSet; + } else { + encoding = Charset.defaultCharset().name(); + } + return encoding; + } + + public Map createMapFromString(String info) { + return GdbUtils.createMapFromString(info, getCharSetEncoding()); + } + + public List createListFromString(String info) { + return GdbUtils.createListFromString(info, getCharSetEncoding()); + } } diff --git a/cnd.debugger.gdb/src/org/netbeans/modules/cnd/debugger/gdb/proxy/GdbProxyEngine.java b/cnd.debugger.gdb/src/org/netbeans/modules/cnd/debugger/gdb/proxy/GdbProxyEngine.java --- a/cnd.debugger.gdb/src/org/netbeans/modules/cnd/debugger/gdb/proxy/GdbProxyEngine.java +++ b/cnd.debugger.gdb/src/org/netbeans/modules/cnd/debugger/gdb/proxy/GdbProxyEngine.java @@ -49,6 +49,7 @@ import java.io.InputStream; import java.io.OutputStream; import java.io.PrintStream; +import java.io.UnsupportedEncodingException; import java.util.Arrays; import java.util.List; import java.util.logging.Level; @@ -160,7 +161,8 @@ final NativeProcess proc = npb.call(); debuggerPid = proc.getPID(); - toGdb = gdbReader(proc.getInputStream(), proc.getOutputStream()); + // for remote execution we need to convert encoding + toGdb = toGdbWriter(proc.getInputStream(), proc.getOutputStream(), GdbDebugger.getCharSetEncoding(execEnv)); new RequestProcessor("GdbReaperThread").post(new Runnable() { // NOI18N public void run() { @@ -205,10 +207,30 @@ DialogDisplayer.getDefault().notify(nd); debugger.finish(false); } + + private BufferedReader getReader(final InputStream is, String charSet) { + // set charset + try { + return new BufferedReader(new InputStreamReader(is, charSet)); + } catch (UnsupportedEncodingException ex) { + // this is possible situation + } + return new BufferedReader(new InputStreamReader(is)); + } - private PrintStream gdbReader(InputStream is, OutputStream os) { - final BufferedReader fromGdb = new BufferedReader(new InputStreamReader(is)); - PrintStream togdb = new PrintStream(os, true); + private PrintStream getPrintStream(final OutputStream os, String charSet) { + // set charset + try { + return new PrintStream(os, true, charSet); + } catch (UnsupportedEncodingException ex) { + // this is possible situation + } + return new PrintStream(os, true); + } + + private PrintStream toGdbWriter(InputStream is, OutputStream os, String encoding) { + PrintStream togdb = getPrintStream(os, encoding); + final BufferedReader fromGdb = getReader(is, encoding); gdbReader = new RequestProcessor("GdbReaderRP").post(new Runnable() { // NOI18N public void run() { diff --git a/cnd.debugger.gdb/src/org/netbeans/modules/cnd/debugger/gdb/ui/MemoryViewTopComponent.java b/cnd.debugger.gdb/src/org/netbeans/modules/cnd/debugger/gdb/ui/MemoryViewTopComponent.java --- a/cnd.debugger.gdb/src/org/netbeans/modules/cnd/debugger/gdb/ui/MemoryViewTopComponent.java +++ b/cnd.debugger.gdb/src/org/netbeans/modules/cnd/debugger/gdb/ui/MemoryViewTopComponent.java @@ -202,7 +202,7 @@ taResult.setText(cb.getError()); } else if (cb.isOK()) { // parse output - Map res = GdbUtils.createMapFromString(cb.getResponse()); + Map res = GdbUtils.createMapFromString(cb.getResponse(), debugger.getCharSetEncoding()); String mem = res.get("memory"); // NOI18N List lines = GdbUtils.createListOfValues(mem); StringBuilder text = new StringBuilder(); @@ -210,7 +210,7 @@ if (text.length() > 0) { text.append("\n"); // NOI18N } - Map fields = GdbUtils.createMapFromString(line); + Map fields = GdbUtils.createMapFromString(line, debugger.getCharSetEncoding()); text.append(fields.get("addr")); // NOI18N text.append(" "); // NOI18N text.append(prepareHex(fields.get("data"))); // NOI18N diff --git a/cnd.debugger.gdb/src/org/netbeans/modules/cnd/debugger/gdb/utils/GdbUtils.java b/cnd.debugger.gdb/src/org/netbeans/modules/cnd/debugger/gdb/utils/GdbUtils.java --- a/cnd.debugger.gdb/src/org/netbeans/modules/cnd/debugger/gdb/utils/GdbUtils.java +++ b/cnd.debugger.gdb/src/org/netbeans/modules/cnd/debugger/gdb/utils/GdbUtils.java @@ -229,7 +229,7 @@ // args=[{name="argc",value="1"},{name="argv",value="0x6f19a8"}], // file="quote.cc",fullname="g:/tmp/nik/Quote1/quote.cc", // line="131"},gdb-result-var="$1",return-value="-1" - private static void processString(String info, PairProcessor processor) { + private static void processString(String info, PairProcessor processor, final String encoding) { int len = info.length(); int i = 0; @@ -269,7 +269,7 @@ // put the value in the map and prepare for the next property String value = info.substring(i, tend); if (key.equals("fullname") || key.equals("file")) { // NOI18N - value = gdbToUserEncoding(value); // possibly convert multi-byte fields + value = gdbToUserEncoding(value, encoding); // possibly convert multi-byte fields } processor.onPair(key, value); i = tend + 2; @@ -283,18 +283,18 @@ * @param info A string of key/value pairs * @return A HashMap containing each key/value */ - public static Map createMapFromString(String info) { + public static Map createMapFromString(String info, final String encoding) { final HashMap map = new HashMap(); processString(info, new PairProcessor() { @Override public void onPair(String key, String value) { map.put(key, value); } - }); + }, encoding); return map; } - public static String gdbToUserEncoding(String string) { + private static String gdbToUserEncoding(String string, final String encoding) { // The first part transforms string to byte array char[] chars = string.toCharArray(); char last = 0, next; @@ -316,7 +316,7 @@ // The second part performs encoding to current coding system try { - string = new String(bytes, System.getProperty("sun.jnu.encoding")); + string = new String(bytes, encoding); } catch (UnsupportedEncodingException e) { } return string; @@ -356,14 +356,14 @@ * @param info A string of key/value pairs * @return An ArrayList with each entry as a value (keys are thrown away, use createMapFromString if you need them) */ - public static List createListFromString(String info) { + public static List createListFromString(String info, String encoding) { final List list = new ArrayList(); processString(info, new PairProcessor() { @Override public void onPair(String key, String value) { list.add(value); } - }); + }, encoding); return list; } diff --git a/cnd.debugger.gdb/test/unit/src/org/netbeans/modules/cnd/debugger/gdb/StringProcessingTestCase.java b/cnd.debugger.gdb/test/unit/src/org/netbeans/modules/cnd/debugger/gdb/StringProcessingTestCase.java --- a/cnd.debugger.gdb/test/unit/src/org/netbeans/modules/cnd/debugger/gdb/StringProcessingTestCase.java +++ b/cnd.debugger.gdb/test/unit/src/org/netbeans/modules/cnd/debugger/gdb/StringProcessingTestCase.java @@ -39,6 +39,7 @@ package org.netbeans.modules.cnd.debugger.gdb; +import java.nio.charset.Charset; import java.util.List; import java.util.Map; import junit.framework.TestCase; @@ -108,7 +109,7 @@ @Test public void testCreateMapFromString1() { - Map map = GdbUtils.createMapFromString("a=\"1\",b={x},c=[\"xyz\"]"); + Map map = GdbUtils.createMapFromString("a=\"1\",b={x},c=[\"xyz\"]", Charset.defaultCharset().name()); assertEquals("1", map.get("a")); assertEquals("x", map.get("b")); assertEquals("\"xyz\"", map.get("c")); @@ -116,7 +117,7 @@ @Test public void testCreateListFromString1() { - List list = GdbUtils.createListFromString("a=\"1\",b={x},c=[\"xyz\"]"); + List list = GdbUtils.createListFromString("a=\"1\",b={x},c=[\"xyz\"]", Charset.defaultCharset().name()); assertEquals("1", list.get(0)); assertEquals("x", list.get(1)); assertEquals("\"xyz\"", list.get(2));