Как распечатать wstring в gdb

Предполагая, что у вас есть только AVX (т. е. нет AVX2), вы можете сделать что-то вроде этого:

float extract_float(const __m128 v, const int i)
{
    float x;
    _MM_EXTRACT_FLOAT(x, v, i);
    return x;
}

void print(const __m128 v)
{
    print(extract_float(v, 0));
    print(extract_float(v, 1));
    print(extract_float(v, 2));
    print(extract_float(v, 3));
}

void print(const __m256 v)
{
    print(_mm256_extractf128_ps(v, 0));
    print(_mm256_extractf128_ps(v, 1));
}

Однако я думаю, что, вероятно, просто использовал бы союз:

union U256f {
    __m256 v;
    float a[8];
};

void print(const __m256 v)
{
    const U256f u = { v };

    for (int i = 0; i < 8; ++i)
        print(u.a[i]);
}
9
задан John Carter 1 March 2010 в 19:27
поделиться

3 ответа

Предположим, что у Вас есть a std::wstring str. Следующее должно работать в gdb:

call printf("%ls", str._M_data())

(-l опция в printf делает это длинной строкой, и я полагаю, что Вам нужно"call"оператор, потому что обычному gdb printf не нравится та опция.)

1
ответ дан 4 December 2019 в 21:52
поделиться

Я провел некоторое исследование, и это - gdb PR716, PR1998, PR2264. По-видимому, это - часто требуемая опция, которая еще не реализована.

0
ответ дан 4 December 2019 в 21:52
поделиться

вызов printf% ls работает только иногда, но чтобы заставить его работать вообще в gdb 6.3, вам потребуется приведение void и перевод строки \ n показано здесь:

call (void)printf("\"%ls\"\n",str.c_str())

вот более надежная команда, которую вы можете поместить в свой .gdbinit, которая также показывает не-ASCII кодовые точки:

define wc_print
echo "
set $c = (wchar_t*)$arg0
while ( *$c )
  if ( *$c > 0x7f )
    printf "[%x]", *$c
  else
    printf "%c", *$c
  end
  set $c++
end
echo "\n
end

просто введите wc (сокращение от wc_print ) с помощью std :: wstring или wchar_t * .

Подробнее см. http://www.firstobject.com/wchar_t-gdb. htm

8
ответ дан 4 December 2019 в 21:52
поделиться
Другие вопросы по тегам:

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