Первая функция не требует никакой аллокации буферов для имяни файла. Как я понял SymGetLineFromAddr64 сама алокирует буфер, однако в MSDN нигде не сказано, что этот буфер я должен освобождать. Вторая же функция явно требует выделения буфера под всю структуру с строку. Внимание вопрос:
1. Нужно ли освобождать строку, которая вернулась из SymGetLineFromAddr64
2. Если нет, то почему для 2-х функция одной и той же библиотеки используются разные приёмы работы со строками
Спасибо
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Здравствуйте, Tom, Вы писали:
Tom>Первая функция не требует никакой аллокации буферов для имяни файла.
MSDN, SymGetLineFromAddr64, Remarks:
The caller must allocate the Line buffer properly and fill in the required members of the IMAGEHLP_LINE64 structure before calling SymGetLineFromAddr64.
MSDN, SymGetSymFromAddr64, Remarks:
The caller must allocate the Symbol buffer properly and fill in the required parameters in the IMAGEHLP_SYMBOL64 structure before calling SymGetSymFromAddr64.
SL>MSDN, SymGetLineFromAddr64, Remarks:
SL>SL>The caller must allocate the Line buffer properly and fill in the required members of the IMAGEHLP_LINE64 structure before calling SymGetLineFromAddr64.
SL>MSDN, SymGetSymFromAddr64, Remarks:
SL>SL>The caller must allocate the Symbol buffer properly and fill in the required parameters in the IMAGEHLP_SYMBOL64 structure before calling SymGetSymFromAddr64.
Ага, только вот пример если смотреть то там:
SymGetSymFromAddr64
DWORD dwAddress;
DWORD dwDisplacement;
BYTE buffer[256];
PSYMBOL_INFO pSymbol = (PSYMBOL_INFO)buffer;
pSymbol->SizeOfStruct = sizeof(SYMBOL_INFO);
pSymbol->MaxNameLen = sizeof(buffer) - sizeof(SYMBOL_INFO) + 1;
if (SymFromAddr(hProcess, dwAddress, &dwDisplacement, pSymbol))
{
// SymFromAddr returned success
}
else
{
// SymFromAddr failed
error = GetLastError();
printf("SymFromAddr returned error : %d\n", error);
}
SymGetLineFromAddr64
DWORD64 dwAddress;
DWORD dwDisplacement;
IMAGEHLP_LINE64 line;
SymSetOptions(SYMOPT_LOAD_LINES);
line.SizeOfStruct = sizeof(IMAGEHLP_LINE64);
if (SymGetLineFromAddr64(hProcess, dwAddress, &dwDisplacement, &line))
{
// SymGetLineFromAddr64 returned success
}
else
{
// SymGetLineFromAddr64 failed
error = GetLastError();
printf("SymGetLineFromAddr64 returned error : %d\n", error);
}
Да и в других местах я видел, что под Line память выделяется только на стеке под структуру а под строку — нет
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Здравствуйте, Tom, Вы писали:
Посмотрел повнимательней — похоже Вы правы. В случае когда память выделяет клиент, он должен передать в функцию не просто указатель на буффер, а еще также и максимальный размер, что мы и видим в 1-м случае:
pSymbol->SizeOfStruct = sizeof(SYMBOL_INFO);
pSymbol->MaxNameLen = sizeof(buffer) - sizeof(SYMBOL_INFO) + 1;
С другой стороны, в IMAGEHLP_LINE64 нет поля для максимального размера, и соответственно мы не можем в функции SymGetLineFromAddr64 безопасно работать с буффером, если его выделит клиент.
Насчет того, должен ли клиент освобождать буффер или он просто получает доступ к строке которая в любом случае где-то хранится, я думаю можно провериить, возврашаются-ли при двух вызовах SymGetLineFromAddr64 разные адреса (тогда _может_ _быть_ можно удалять), или один и тот-же (тогда точно нельзя).
Указатель один и тот же. Походу там просто статический буфер.
... << RSDN@Home 1.1.4 beta 4 rev. 303>>