MAP文件格式详解

本文介绍如何在Visual C++环境中生成MAP文件,包括配置步骤和编译命令。解析MAP文件内容,展示如何通过MAP文件定位程序错误,特别关注代码段偏移与行号对应关系,帮助开发者快速定位并修复问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文件生成方式:

 VC 中,我们可以按下 Alt+F7 ,打开“Project Settings”选项页,选择 C/C++ 选项卡,并在最下面的 Project Options 里面输入:/Zd ,然后要选择 Link 选项卡,在最下面的 Project Options 里面输入: /mapinfo:lines  /map:PROJECT_NAME.map 。最后按下 F7 来编译生成 EXE 可执行文件和 MAP 文件。

文件格式:

DllTwo                                                                                    //―――模块名

 

 Timestamp is 4956e425 (Sun Dec 28 10:27:49 2008)                   //―――时间戳

 

 Preferred load address is 10000000                                            //―――默认加载基地址

 

 Start         Length     Name                   Class                            //各节的起始地址、长度

 0001:00000000 00000da6H .text                   CODE                   //节名、类型等信息

 0001:00000db0 00000053H .text$x                 CODE

 0002:00000000 000000e8H .idata$5                DATA

 0002:000000e8 00000004H .CRT$XCA                DATA

……

 0002:00000100 000000b0H .rdata                  DATA

……

 0002:0000045c 00000782H .idata$6                DATA

 0002:00000be0 00000094H .edata                  DATA

 0003:00000000 00000014H .data                   DATA

 0003:00000018 00000354H .bss                    DATA

 

//各符号在节内的偏移地址、加载地址及符号出处

  Address         Publics by Value              Rva+Base       Lib:Object

 

 0000:00000003       ___safe_se_handler_count   00000003     <absolute>

 0000:00000000       ___ImageBase               10000000     <linker-defined>

 0001:00000000       ??4CDllTwo@@QAEAAV0@ABV0@@Z 10001000 f i DllTwo.obj

……

0001:00000804       __DllMainCRTStartup@12     10001804 f   MSVCRT:crtdll.obj

……

 0001:00000cd0       ?CrashFun@@YAHXZ           10001cd0 f   DllTwo.obj

 0001:00000cf0       _DllMain@12                10001cf0 f   DllTwo.obj

 0001:00000d00       ?PrintInDllTwo@@YAHXZ      10001d00 f   DllTwo.obj

 

 entry point at        0001:00000804                     //模块的入口地址

 

 Static symbols                                                 //静态符号

 

 0001:00000463       __catch$??$?6U?$char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@PBD@Z$0 10001463 f i  CIL library: CIL module

 0001:000004de       _pre_c_init                100014de f   MSVCRT:crtdll.obj

 0001:000006ee       ___DllMainCRTStartup       100016ee f   MSVCRT:crtdll.obj

 0001:00000db0      

……

 

 Exports                                              //导出符号

 

  ordinal    name                                   //序号和名称

 

        1    ??4CDllTwo@@QAEAAV0@ABV0@@Z (public: class CDllTwo & __thiscall CDllTwo::operator=(class CDllTwo const &))

        2    ?CrashFun@@YAHXZ (int __cdecl CrashFun(void))

        3    ?PrintInDllTwo@@YAHXZ (int __cdecl PrintInDllTwo(void))

测试方式:

写一个程序,编译出来:

#include <stdio.h>

int main(){
    int i = 2;
    int j ;
    scanf("%d",&j);
    i = 2;
    i = 3;
    i = 4;
    i = 5;
    i = 6;
    printf("%d",i/j);
    return 0 ;
}

然后打开MAP文件.
里面有各种全局符号,大概在文件的中间位置,有这样的东西:
Line numbers for .\Debug\4.obj(E:\pro\4\4.cpp) segment .text

     3 0001:00000010     4 0001:00000024     6 0001:0000002b     7 0001:0000003c
     8 0001:00000043     9 0001:0000004a    10 0001:00000051    11 0001:00000058

可以直接Ctrl+F找到程序文件名,我这里是4.cpp
这些就是代码偏移和对应的行号.

三.调试

就刚才的程序,运行,输个0,过一下出错框就来了,
我是VISTA,下面的详细信息是:
问题签名:
问题事件名称:    APPCRASH
应用程序名:    4.exe
应用程序版本:    0.0.0.0
应用程序时间戳:    499d5ade
故障模块名称:    4.exe
故障模块版本:    0.0.0.0
故障模块时间戳:    499d5ade
异常代码:    c0000094
异常偏移量:    00001063
OS 版本:    6.0.6001.2.1.0.768.3
区域设置 ID:    2052
其他信息 1:    38fc
其他信息 2:    db4f9c1c160faa4608f429ddffa01d6f
其他信息 3:    cb3b
其他信息 4:    e8ffb2a21d4a9ed7b258f1866c9d3db8

这个偏移就是要看的了。减去1000的代码段偏移。
就是63,再对照上面的行号和地址的列表
11 0001:00000058
这个是VC翻译的时候,第11行显然会对应多条指令。
这一指令群的开始地址是58.
这个是最接近63且比63小的地址,所以问题应该出在这一行上。
再看代码:
printf("%d",i/j);
发现这里有个除0错误。

### 在CI/CD中使用Tasking编译器的配置方法 #### 1. 安装和准备Tasking工具链 为了在CI/CD环境中成功集成Tasking编译器,首先需要确保构建服务器已正确安装并配置了Tasking工具链。这可以通过以下方式实现: - **下载和安装**:根据官方文档[^4],可以获取适用于Tricore架构的Tasking编译器版本(如Tasking6.3)。将其解压到指定目录,并确认其许可证文件已正确定位。 - **环境变量设置**:通过修改系统的`PATH`环境变量来包含Tasking编译器的可执行文件路径。例如,在Windows环境下,可能需要将类似`\path_to_tasking\bin`这样的路径加入到系统环境变量中。 ```bash export PATH=$PATH:/path/to/tasking/bin ``` 以上操作完成后,可以在命令行测试是否能够正常调用Tasking编译器及其相关工具。 --- #### 2. 使用CMake配置Toolset 自CMake 3.25起引入了一个新的功能——`CMAKE_TASKING_TOOLSET`[^1],它允许开发者更灵活地定义特定于Tasking编译器的工具集。以下是具体步骤: - 创建一个适合项目的CMakeLists.txt文件,其中应明确指明使用的编译器以及目标平台特性。 ```cmake cmake_minimum_required(VERSION 3.25) project(MyTriCoreProject LANGUAGES CXX ASM) # 设置Tasking toolset set(CMAKE_TASKING_TOOLSET "tricore") add_executable(my_app main.c startup.s) target_link_libraries(my_app PRIVATE ${TASKING_LIBRARIES}) ``` 在此基础上,还可以进一步定制化链接脚本或者映射文件的位置,以便更好地控制最终二进制文件的行为与结构[^5]。 --- #### 3. 集成GitLab CI/CD管道 对于基于GitLab的持续集成流程来说,主要工作集中在`.gitlab-ci.yml`文件的设计上。下面是一个简单的模板示例,展示了如何利用Docker镜像配合预设好的开发环境完成自动化构建过程: ```yaml stages: - build variables: TASKING_COMPILER_PATH: "/usr/local/tasking" build_job: stage: build image: custom-tasking-build-env:latest # 自定义容器镜像,内置所需依赖项 script: - echo $PATH | grep "$TASKING_COMPILER_PATH" - cmake -S . -B build -DCMAKE_TASKING_TOOLSET=tricore - cmake --build build --config Release artifacts: paths: - build/ ``` 这里的关键在于选用合适的基底镜像(`custom-tasking-build-env`),该镜像应当已经包含了之前提到过的所有必要组件,比如Java运行时支持、完整的Tasking SDK等等。 --- #### 4. 调整启动代码位置及其他高级选项 当涉及到嵌入式应用时,通常还需要特别关注应用程序入口点的选择等问题。这些都可以借助专门的地图(Map)文件来进行精细化管理[^5]。例如,如果希望改变默认的启动地址,则可在相应的链接描述符里重新声明之。 --- ### 总结 综上所述,要在现代CI/CD框架下有效运用Tasking系列编译器,不仅需要熟悉基础的操作指南[^3][^4],而且要善于结合诸如CMake之类的现代化构建工具所提供的强大能力[^1]。与此同时,合理规划整个流水线作业链条也是不可或缺的一环。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值