Кодировка по умолчанию для варианта bstr к станд.:: преобразование строк

Можно присоединить отладчик к многопоточному процессу Python, но необходимо сделать это на уровне C. Для понимания, что продолжается Вам нужен интерпретатор Python, который будет скомпилирован с символами. Если Вы не имеете один, необходимо загрузить источник с python.org и создать его сами:

./configure --prefix=/usr/local/pydbg
make OPT=-g
sudo make install
sudo ln -s /usr/local/pydbg/bin/python /usr/local/bin/dbgpy

Удостоверяются, что Ваша рабочая нагрузка работает на той версии интерпретатора. Можно затем присоединить к нему с GDB в любое время. Люди Python включали образец ".gdbinit" в их каталог Misc, который имеет некоторые полезные макросы. Однако это повреждается для многопоточной отладки (!). Необходимо заменить строки как это

while $pc < Py_Main || $pc > Py_GetArgcArgv

со следующим:

while ($pc < Py_Main || $pc > Py_GetArgcArgv) && ($pc < t_bootstrap || $pc > thread_PyThread_start_new_thread)

Иначе команды как pystack не завершатся на потоках кроме основного потока. С этим материалом на месте, можно сделать материал как [1 110]

gdb> attach 
gdb> info threads
gdb> thread 
gdb> bt
gdb> pystack
gdb> detach

и видеть то, что продолжается. Отчасти.

можно проанализировать то, что объекты с "pyo" макросом. у Chris есть некоторые примеры на его блоге.

Удача.

(Публичное выражение благодарности для блог даН для некоторой ключевой информации для меня, особенно поточная обработка фиксирует!)

8
задан Kirill V. Lyadvinsky 1 December 2009 в 17:14
поделиться

2 ответа

Оператор char * вызывает метод _com_util :: ConvertBSTRToString () . Документация довольно бесполезна, но я предполагаю, что она использует текущие настройки локали для преобразования.

Обновление:

Внутренне, _com_util :: ConvertBSTRToString () вызывает WideCharToMultiByte , передача нуля для всех параметров кодовой страницы и символов по умолчанию. Это то же самое, что и передача CP_ACP , что означает использование текущей настройки кодовой страницы системы ANSI (а не настройки текущего потока).

Если вы хотите избежать потери данных, вам, вероятно, следует вызвать WideCharToMultiByte напрямую и использовать CP_UTF8 . Вы по-прежнему можете рассматривать строку как однобайтовую строку с завершающим нулем и использовать std :: string , вы просто не можете обрабатывать байты как символы.

10
ответ дан 5 December 2019 в 17:38
поделиться

std :: string сам по себе не указывает / не содержит кодировку. Это просто последовательность байтов. То же самое касается std :: wstring , который представляет собой просто последовательность wchar_t s (двухбайтовых слов в Win32).

Путем преобразования _bstr_t ] на char * через его оператор char * , вы просто получите указатель на необработанные данные. Согласно MSDN , эти данные состоят из широких символов, то есть wchar_t s, которые представляют UTF-16.

Я удивлен, что это действительно работает для создания std :: string отсюда; вы не должны проходить мимо первого нулевого байта (что произойдет вскоре, если ваша исходная строка - английская).

Но поскольку wstring является строкой wchar_t ,

0
ответ дан 5 December 2019 в 17:38
поделиться
Другие вопросы по тегам:

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