Использование SymSrvStoreFileW из DBGHELP

Я пытаюсь призвать SymSrvStoreFileW из DBGHELP.DLL (после предыдущей неудачной попытки получить SymSrvGetFileIndexInfoW работать). Важные функции определены в MSDN следующим образом:

BOOL WINAPI SymInitialize(
_In_      HANDLE hProcess,
_In_opt_  PCTSTR UserSearchPath, // null is documented as fine
_In_      BOOL fInvadeProcess // false
);

PCTSTR WINAPI SymSrvStoreFile(
_In_      HANDLE hProcess,
_In_opt_  PCTSTR SrvPath, // e.g. "srv*C:\symbols"_In_      PCTSTR File, // e.g. "C:\myapp.pdb"_In_      DWORD Flags // I am using SYMSTOREOPT_RETURNINDEX (0x04)
);

BOOL WINAPI SymCleanup(
_In_  HANDLE hProcess
);

hProcess немного странно, из документация Я понимаю, что на самом деле не имеет значения, что вы передаете, пока вы остаетесь последовательным. Я использовал как текущий идентификатор процесса, так и идентификатор «любое старое значение». Ни один не работал.

Я сделал следующее externs:

[DllImport("dbghelp.dll", EntryPoint = "SymInitializeW", CharSet = CharSet.Unicode, ExactSpelling = true, SetLastError = true)]
public static extern bool SymInitialize(
IntPtr process,
[param: MarshalAs(UnmanagedType.LPTStr)]
string searchPath,
bool invadeProcess);

[DllImport("dbghelp.dll", EntryPoint = "SymCleanup", CharSet = CharSet.Unicode, ExactSpelling = true, SetLastError = true)]
public static extern bool SymCleanup(IntPtr process);

[DllImport("dbghelp.dll", EntryPoint = "SymSrvStoreFileW", CharSet = CharSet.Unicode, ExactSpelling = true, SetLastError = true)]
[return: MarshalAs(UnmanagedType.LPTStr)]
public static extern string SymSrvStoreFile(
IntPtr process,
[param: MarshalAs(UnmanagedType.LPTStr)]
string srvPath,
[param: MarshalAs(UnmanagedType.LPTStr)]
string file,
SymStoreOpt options);

enum SymStoreOpt : uint
{
None = 0x00,
Compress = 0x01,
Overwrite = 0x02,
Pointer = 0x08,
ReturnIndex = 0x04,
PassIfExists = 0x40,
}

И попытался позвонить:

var processId = IntPtr.Zero;
try
{
// This succeeds.
processId = new IntPtr(Process.GetCurrentProcess().Id);
if (!NativeMethods.SymInitialize(processId, null, false))
{
processId = IntPtr.Zero;
throw new Win32Exception(Marshal.GetLastWin32Error());
}

// This fails.
var storageLocation = NativeMethods.SymSrvStoreFile(processId, "srv*C:\\vssym", "C:\\test\\mscorlib.pdb", SymStoreOpt.ReturnIndex);
if (storageLocation == null)
{
// Errors under various circumstances.
// - The operation completed successfully (but storageLocation is still null)
// - The specified module could not be found
throw new Win32Exception(Marshal.GetLastWin32Error());
}
}
finally
{
if (processId != IntPtr.Zero)
NativeMethods.SymCleanup(processId);
}

Есть ли ошибки с моим extern декларации? Кроме того, кто-нибудь знает, как получить место хранения символов для PDB / PE (а не только .Net)? Я также попробовал другой SymStoreOpt флаги и некуда.

В какой-то момент (я не помню, что я сделал) файл появился в месте хранения символов (хотя ReturnIndex был использован), но в этот момент мой процесс завершился сбоем (один из тех, где отладчик даже не перехватил его), повторный запуск привел бы к «операции успешно» без возвращаемого значения.

РЕДАКТИРОВАТЬ: Я пробовал это в C ++ и все равно получаю такое же поведение — очевидно, я не хочу идти по этому пути, потому что P / Invoke обладает преимуществом нейтральности архитектуры.

2

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]