Можно присоединить отладчик к многопоточному процессу 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 есть некоторые примеры на его блоге.
Удача.
(Публичное выражение благодарности для блог даН для некоторой ключевой информации для меня, особенно поточная обработка фиксирует!)
Оператор char *
вызывает метод _com_util :: ConvertBSTRToString ()
. Документация довольно бесполезна, но я предполагаю, что она использует текущие настройки локали для преобразования.
Обновление:
Внутренне, _com_util :: ConvertBSTRToString ()
вызывает WideCharToMultiByte
, передача нуля для всех параметров кодовой страницы и символов по умолчанию. Это то же самое, что и передача CP_ACP
, что означает использование текущей настройки кодовой страницы системы ANSI (а не настройки текущего потока).
Если вы хотите избежать потери данных, вам, вероятно, следует вызвать WideCharToMultiByte
напрямую и использовать CP_UTF8
. Вы по-прежнему можете рассматривать строку как однобайтовую строку с завершающим нулем и использовать std :: string
, вы просто не можете обрабатывать байты как символы.
std :: string
сам по себе не указывает / не содержит кодировку. Это просто последовательность байтов. То же самое касается std :: wstring
, который представляет собой просто последовательность wchar_t
s (двухбайтовых слов в Win32).
Путем преобразования _bstr_t
] на char *
через его оператор char * , вы просто получите указатель на необработанные данные. Согласно MSDN , эти данные состоят из широких символов, то есть wchar_t
s, которые представляют UTF-16.
Я удивлен, что это действительно работает для создания std :: string
отсюда; вы не должны проходить мимо первого нулевого байта (что произойдет вскоре, если ваша исходная строка - английская).
Но поскольку wstring
является строкой wchar_t
,