【问题标题】:Cancel downloading symbols in Debug Help Library在调试帮助库中取消下载符号
【发布时间】:2022-09-29 01:53:21
【问题描述】:

调试帮助库允许从外部存储加载符号。您只需调用SymSetSearchPath,指定符号服务器,然后SymLoadModuleExW 从指定位置加载符号。

下载符号可能需要一些时间,我目前正在寻找一种取消下载符号的方法。但突然间我找不到任何 API。

有没有办法取消下载符号?

  • 我怀疑有。您可以做的最好的事情是将符号加载卸载到您愿意放弃的牺牲执行线程上。由于\"All DbgHelp functions, such as this one, are single threaded\" 我无法想象如何在 API 中实现或公开操作的取消。
  • @IInspectable,我已经预料到了,但仍然希望我有机会。我目前正在使用一个单独的进程来下载符号并在下载取消时终止它。但我不喜欢这个解决方案,它看起来有点脏。
  • 终止sacrificial process 远没有terminating a thread 脏。有时,当您处理并非实际设计的设计时,您将不得不在美学上做出妥协。
  • 您不能取消加载模块,VisualStudio 也不能。

标签: winapi dbghelp


【解决方案1】:

您只能在您无法控制的特定时间进行。

要取消下载,您:

  1. 使用SymRegisterCallback64SymRegisterCallbackW64 函数注册回调函数。
  2. callback 处理CBA_DEFERRED_SYMBOL_LOAD_CANCEL 消息。

    例如

        SymRegisterCallbackW64(process, sym_register_callback_proc64, nullptr);
    
        BOOL CALLBACK sym_register_callback_proc64(__in HANDLE h_process, __in ULONG const action_code, __in_opt ULONG64 const callback_data, __in_opt ULONG64 const user_context)
        {
            switch (action_code)
            {
    ...
            case CBA_DEFERRED_SYMBOL_LOAD_CANCEL:
                if(<test for cancel now?>)
                {
                    return TRUE;
                }
                break;
    ...
            }
    
            // Return false to any ActionCode we don't handle
            // or we could generate some undesirable behavior.
            return FALSE;
        }
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-06
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 2011-11-26
    相关资源
    最近更新 更多