SymGetLineFromAddr64 SymGetSymFromAddr64
От: Tom Россия http://www.RSDN.ru
Дата: 23.08.05 09:27
Оценка:
Первая функция не требует никакой аллокации буферов для имяни файла. Как я понял SymGetLineFromAddr64 сама алокирует буфер, однако в MSDN нигде не сказано, что этот буфер я должен освобождать. Вторая же функция явно требует выделения буфера под всю структуру с строку. Внимание вопрос:

1. Нужно ли освобождать строку, которая вернулась из SymGetLineFromAddr64
2. Если нет, то почему для 2-х функция одной и той же библиотеки используются разные приёмы работы со строками

Спасибо
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Народная мудрось
всем все никому ничего(с).
Re: SymGetLineFromAddr64 SymGetSymFromAddr64
От: SergeyL Россия  
Дата: 23.08.05 09:44
Оценка:
Здравствуйте, 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.

Re[2]: SymGetLineFromAddr64 SymGetSymFromAddr64
От: Tom Россия http://www.RSDN.ru
Дата: 23.08.05 09:57
Оценка:
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>>
Народная мудрось
всем все никому ничего(с).
Re[3]: SymGetLineFromAddr64 SymGetSymFromAddr64
От: SergeyL Россия  
Дата: 23.08.05 10:34
Оценка:
Здравствуйте, Tom, Вы писали:

Посмотрел повнимательней — похоже Вы правы. В случае когда память выделяет клиент, он должен передать в функцию не просто указатель на буффер, а еще также и максимальный размер, что мы и видим в 1-м случае:

pSymbol->SizeOfStruct = sizeof(SYMBOL_INFO);
pSymbol->MaxNameLen = sizeof(buffer) - sizeof(SYMBOL_INFO) + 1;


С другой стороны, в IMAGEHLP_LINE64 нет поля для максимального размера, и соответственно мы не можем в функции SymGetLineFromAddr64 безопасно работать с буффером, если его выделит клиент.

Насчет того, должен ли клиент освобождать буффер или он просто получает доступ к строке которая в любом случае где-то хранится, я думаю можно провериить, возврашаются-ли при двух вызовах SymGetLineFromAddr64 разные адреса (тогда _может_ _быть_ можно удалять), или один и тот-же (тогда точно нельзя).
Re[4]: SymGetLineFromAddr64 SymGetSymFromAddr64
От: Tom Россия http://www.RSDN.ru
Дата: 23.08.05 10:46
Оценка:
Указатель один и тот же. Походу там просто статический буфер.
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Народная мудрось
всем все никому ничего(с).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.