Вопрос по windows, 64bit – Самый быстрый способ получить TID (блок информации о потоках) в 64-битном приложении Windows?

2

У меня очень требовательный к вычислениям модуль, в котором я добавил трассировку стека, чтобы найти конкретные проблемы. Хотя приложению разрешено работать медленнее, когда включена эта трассировка стека, оно не должно выполняться в 10 раз медленнее. Вот почему я не использую подпрограммы StackWalk из DBGHELP.DLL, но я сам прохожу стек, используя указатели фреймов (поэтому я не использую опцию компилятора пропуска указателей фреймов).

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

Я знаю, что это, возможно, ошибка где-то, но чтобы сделать мой код более безопасным, мне нужен способ проверить, указывает ли указатель кадра на область памяти в стеке текущего потока или нет. Приложение является 64-битным и работает под Windows.

Код наКак получить информацию о стеке потоков в Windows? возможно, это решает проблему, но так как это вызывает другие функции, это, вероятно, заставляет мой код работать намного медленнее (честно говоря, я не тестировал его).

Я также нашел некоторый встроенный код сборки, который должен выполнить трюк (http://nasutechtips.blogspot.com/2011/01/thread-information-block-tib-and-fs.html), но встроенная сборка не поддерживается 64-битным компилятором Microsoft C ++.

Кроме того, внутреннее __readfsqword, похоже, не работает на 64-битной версии.

Любые другие предложения о том, как получить TIB на 64-битной как можно быстрее?

Интересно, что сейчас я делаю то же самое для управляемого кода, и я столкнулся с той же самой проблемой ;-). Alois Kraus

Ваш Ответ

2   ответа
2

так должно быть__readgsqword вместо__readfsqword на 64-битной.

3

Нашел, следующий код делает свое дело:

#include <windows.h>
#include <winnt.h>

struct _TEB
   {
   NT_TIB NtTib;
   // Ignore rest of struct
   };

void *startOfStack;
startOfStack = NtCurrentTeb()->NtTib.StackBase;
std::cout << "startOfStack = " << startOfStack << std::endl;

Я посмотрел на определение NtCurrentTeb () в winnt.h, и похоже, что это функция очень низкого уровня, поэтому она, вероятно, будет достаточно быстрой, чтобы получить то, что я хочу.

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