У меня может быть переход gdb мимо оператора броска в конце функции?

Я не уверен, но я думаю, что строка хранит свою информацию как массив Символов, который неэффективен с байтами. А именно, определение Символа, "Представляет символ Unicode".

берут этот образец в качестве примера:

String str = "asdf éß";
String str2 = "asdf gh";
EncodingInfo[] info =  Encoding.GetEncodings();
foreach (EncodingInfo enc in info)
{
    System.Console.WriteLine(enc.Name + " - " 
      + enc.GetEncoding().GetByteCount(str)
      + enc.GetEncoding().GetByteCount(str2));
}

Обращают внимание, что ответ Unicode составляет 14 байтов в обоих экземплярах, тогда как ответ UTF-8 составляет только 9 байтов для первого, и только 7 для второго.

Поэтому, если Вы просто хотите байты, используемые строкой, просто используйте Encoding.Unicode, но это будет неэффективно с пространством памяти.

5
задан Benjamin 8 December 2013 в 15:44
поделиться

5 ответов

Мое неправильное написание фактически дало мне ответ!

Мой вариант «дизассемблировать» не работал, поэтому, ища правильное написание, я в конце концов наткнулся на «стек помощи»:

Осмотр стопки. Стек состоит из кадров стека. Gdb присваивает номера кадрам стека отсчет от нуля для самого внутреннего (выполняющегося в данный момент) кадра.

В любой момент gdb идентифицирует один кадр как «выбранный». Поиск переменных выполняется относительно выбранного кадра. Когда отлаживаемая программа останавливается, gdb выбирает самый внутренний фрейм. Команды ниже могут использоваться для выбора других кадров по номеру или адресу.

Список команд:

backtrace - Распечатать обратную трассировку всех кадров стека

bt - Распечатать обратную трассировку всех кадров стека

вниз - Выбрать и распечатать кадр стека, вызываемый этим одним

кадром - Выбрать и распечатать возврат кадра стека

- Вернуть выбранный кадр стека его вызывающему

кадру выбора - Выбрать кадр стека без печать чего-либо

вверх - Выберите и распечатайте фрейм стека, который вызвал этот

Команда return из приведенного выше списка делает именно то, что я хочу в этом случае.

Спасибо вам всем за ваша помощь.

5
ответ дан 18 December 2019 в 09:52
поделиться

Да, можно. Вам необходимо установить указатель инструкции на желаемое значение.

  (gdb) set $eip = 0xValue
7
ответ дан 18 December 2019 в 09:52
поделиться

Во многих случаях компилятор удаляет конец функции, поскольку он недоступен. Вы можете сделать флаг, который вы можете установить, чтобы избежать этого:

void bar() {
  if (!debugFlag)
    throw int();
}

Убедитесь, что флаг глобальный (не статический), чтобы компилятор не мог доказать, что он никогда не будет записан.

Чтобы пропустить бросок,

(gdb) set debugFlag = 1

И не забудьте вернуть его позже.

2
ответ дан 18 December 2019 в 09:52
поделиться

Расширение ответа @Justin - в то время как в функции типа bar () дизассемблируйте , обратите внимание на адрес инструкции ret , установите eip на этот адрес.

2
ответ дан 18 December 2019 в 09:52
поделиться

% eip зависит от платформы и требует некоторой работы. Проще просто перейти к номеру строки, содержащей конец фигурной скобки. Вам нужно объединить это с чем-то вроде того, что предлагает bdonlan на тот случай, если компилятор оптимизирует функцию return-from как недоступную.

$ cat >x.cpp
#include <stdio.h>

static volatile int debug = 0;

void f() {
  if (!debug)
    throw 1;
}

int main() {
  try {
    f();
    puts("f didn't throw");
  } catch(...) {
    puts("f threw");
  }
  return 0;
}

$ g++ -g x.cpp -o x
$ gdb x
[...]
(gdb) run
Starting program: [...]/x 
Reading symbols for shared libraries . done
f threw

Program exited normally.
(gdb) break f
Breakpoint 1 at 0x1e30: file x.cpp, line 6.
(gdb) run
Starting program: [...]/x 

Breakpoint 1, f () at x.c:6
6         if (!debug)
(gdb) jump 8
Continuing at 0x1e73.
f didn't throw

Program exited normally.
1
ответ дан 18 December 2019 в 09:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: