下载器 -- 调试工具(备忘)
一、背景
桌面客户端开发会涉及到文件更新:大文件的局部更新。通常情况下,我们可以使用了 Aria2c 作为辅助下载工具(非 libaria)。文件局部更新的需求,实现主流的更新下载方案很重要。
二、现状
自研下载器是采用 Golang 语言开发,并以库的形式供平台集成。开发前期存在以下问题:
- Golang 只能提供 Windows 平台的动态链接库,且缺少 *.lib 符号文件
- 自研库的开发同学资历尚浅,且库未作 Windows 平台下的功能性验证
因此,要作一些准备工作以提高开发效率:
- lib 生成工具:以应对 SDK 接入前期频繁更换库文件的情况
- C++ 测试环境:以用于 SDK 接入前期的频繁验证工作
三、解决方案
本节内容将以列表形式提供: lib 工具生成、VSCode 测试环境
1、lib 生成(手动)
动态库的使用方式分为:动态调用,静态调用。SDK 导出库只给到了 *.h 和 *.dll 文件。要想以静态调用的方式使用,我们需要通过 *.dll 生成对应的 *.lib 符号文件。大致步骤如下:
- 导出 dump.txt
使用 Developer Command Prompt for VS 20XX 工具,通过命令行dumpbin /EXPORTS *.dll > dump.txt
导出:导出信息相当丰富,但我们只需要 Section 段落中的导出函数名, 比如:CreateDecoder 等…1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18Dump of file 7z.dll
File Type: DLL
Section contains the following exports for 7z.dll
00000000 characteristics
62D16FC1 time date stamp Fri Jul 15 21:46:41 2022
0.00 version
1 ordinal base
13 number of functions
13 number of names
ordinal hint RVA name
1 0 0010D6E0 CreateDecoder
.
Summary
9000 .data 13000 .pdata 55000 .rdata 4000 .reloc 19000 .rsrc 137000 .text - 生成 .def
DEF 文件格式详见官方介绍。本着最简原则,我们只需要用到:LIBRARY、EXPORTS。为了简化操作步骤,我们需要一个辅助工具: 根据 dump 信息生成 .def 文件 (导出接口变化时,才需要重新导出 DEF) 。辅助工具逻辑大致如下:- 读取 dump 文件:
dump.txt
- 定位 Section 段落:
- begin with:
original hint RVA
- end with:
Summary
- begin with:
- 搜索符号并写入 .DEF 文件
- 读取 dump 文件:
- 生成 .lib :
使用 Developer Command Prompt for VS 工具,通过命令行:lib /def:example.def /machine:x64 /out:example.lib
2、lib 生成工具
现成的开源工具 IMPLIB,可以根据 DLL 文件或者 DEF 文件生成对应的导出文件 LIB。使用教程可参考官方文件,大致命令如下:
1 |
|
3、测试环境搭建:VSCode with C++
当 DLL 接口更新时,涉及到的工作流大致如下:
- 测试环境:快速生成 EXE、快速步进 DEBUG。
- 测试链路: 生成 .lib –> 生成 EXE –> DEBUG。
VSCode 谁用谁知道,开发利器。因此,博主就将 VSCode 作为我们的测试环境。 关于 VSCode C++ 环境的搭建,网上教程一大把。因此,博主只对一些必要的配置做介绍。
- mingw64: 提供 Windows 下软件构建所需的工具,如:gcc, g++ 等
- launch.json: vscode 启动程序的配置文件
- program: EXE 的全路径
- miDebuggerPath: GDB 的全路径
- preLaunchTask: EXE 运行的前置工作,如:编译工作。
- task.json: 协助 launch.json 的前置工作
- label: 任务提示词,执行构建时供用户选用的提示
- command: 执行命令
- args: 构建参数,比如:源文件、包含路径、依赖路径等
下载器 -- 调试工具(备忘)
https://jalencui.com/2023/09/15/SDK-Downloader-part1/