一,配置vs

二,程序崩溃界面

// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
// #include <iostream> void fun(bool flag)
{
if (flag) {
printf("hello world\n");
}
else {
printf("sorry.\n");
}
int a = , b = ;
int c = b / a;
} int main()
{
bool m = false;
fun(m);
//std::cout << "Hello World!\n";
system("pause");
return ;
} // 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单 // 入门使用技巧:
// 1. 使用解决方案资源管理器窗口添加/管理文件
// 2. 使用团队资源管理器窗口连接到源代码管理
// 3. 使用输出窗口查看生成输出和其他消息
// 4. 使用错误列表窗口查看错误
// 5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
// 6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件

三,map文件

: 00000388H .bss                    DATA
: 0000002dH .msvcjmc DATA
: 00000060H .rsrc$ DATA
: 00000180H .rsrc$ DATA Address Publics by Value Rva+Base Lib:Object : ___hybrid_code_map_count <absolute>
: ___AbsoluteZero <absolute>
: ___hybrid_code_map <absolute>
: ___volatile_metadata <absolute>
: ___hybrid_auxiliary_iat <absolute>
: ___guard_longjmp_count <absolute>
: ___dynamic_value_reloc_table <absolute>
: ___guard_iat_count <absolute>
: ___enclave_config <absolute>
: ___guard_fids_count <absolute>
: ___guard_longjmp_table <absolute>
: ___guard_iat_table <absolute>
: ___guard_fids_table <absolute>
: ___safe_se_handler_count <absolute>
: ___guard_flags <absolute>
: ___ImageBase <linker-defined>
: ?__empty_global_delete@@YAXPAX@Z f i ConsoleApplication1.obj
: ?__empty_global_delete@@YAXPAXI@Z f i ConsoleApplication1.obj
0001:00000080 ?fun@@YAX_N@Z 00401080 f ConsoleApplication1.obj
: __JustMyCode_Default f i ConsoleApplication1.obj
: ___local_stdio_printf_options f i ConsoleApplication1.obj
: __vfprintf_l f i ConsoleApplication1.obj
:000001d0 _main 004011d0 f ConsoleApplication1.obj
: _printf f i ConsoleApplication1.obj
:000002c0 @__CheckForDebuggerJustMyCode@ 004012c0 f MSVCRTD:debugger_jmc.obj
: @_RTC_AllocaHelper@ f MSVCRTD:stack.obj
: @_RTC_CheckStackVars2@ f MSVCRTD:stack.obj
: @_RTC_CheckStackVars@ f MSVCRTD:stack.obj
: __RTC_CheckEsp f MSVCRTD:stack.obj

如果仔细浏览 Rva+Base 这栏,你会发现第一个比崩溃地址大的地址0x00401080,所以在 这个地址之前的那个入口就是产生崩溃的函数

因此,发生崩溃的函数就是 ?Crash@@YAXXZ ,所有以问号开头的函数名称都是 C++ 修饰的名称

什么是 MAP 文件?简单地讲, MAP 文件是程序的全局符号、源文件和代码行号信息的唯一的文本表示方法,它可以在任何地方、任何时候使用,不需要有额外的程序进行支持。而且,这是唯一能找出程序崩溃的地方的救星。

好吧,既然 MAP 文件如此神奇,那么我们应该如何生成它呢?在 VC 中,我们可以按下 Alt+F7 ,打开“Project Settings”选项页,选择 C/C++ 选项卡,并在最下面的 Project Options 里面输入:/Zd ,然后要选择 Link 选项卡,在最下面的 Project Options 里面输入: /mapinfo:lines 和 /map:PROJECT_NAME.map 。最后按下 F7 来编译生成 EXE 可执行文件和 MAP 文件。

在 MASM 中,我们要设置编译和连接参数,我通常是这样做的:

rc %1.rc
ml /c /coff /Zd %1.asm
link /subsystem:windows /mapinfo:exports /mapinfo:lines /map:%1.map %1.obj %1.res

把它保存成 makem.bat ,就可以在命令行输入 makem filename 来编译生成 EXE 可执行文件和 MAP 文件了。

在此我先解释一下加入的参数的含义:

/Zd 表示在编译的时候生成行信息
/map[:filename] 表示生成 MAP 文件的路径和文件名
/mapinfo:lines 表示生成 MAP 文件时,加入行信息
/mapinfo:exports 表示生成 MAP 文件时,加入 exported functions (如果生成的是 DLL 文件,这个选项就要加上)

参考:

https://blog.csdn.net/anddy926/article/details/7695476/
https://blogs.msdn.microsoft.com/hopperx/2006/09/14/using-map-files-part-1/

https://blog.csdn.net/u012138730/article/details/90611728

通过map文件找程序崩溃的代码行的更多相关文章

  1. VS2005(vs2008,vs2010)使用map文件查找程序崩溃原因

    VS 2005使用map文件查找程序崩溃原因 一般程序崩溃可以通过debug,找到程序在那一行代码崩溃了,最近编一个多线程的程序,都不知道在那发生错误,多线程并发,又不好单行调试,终于找到一个比较好的 ...

  2. 利用WinDbg找出程序崩溃的代码行号

    之前碰到论坛里有几个好友,说程序不时的崩溃,什么xxoo不能read的! 如果光要是这个内存地址,估计你会疯掉~~ 所以分享一下基本的调试技巧,需要准备的工具有WinDbg + VC6.0, 下面是自 ...

  3. 如何定位Release 版本中程序崩溃的位置 ---利用map文件 拦截windows崩溃函数

    1       案例描述 作为Windows程序员,平时最担心见到的事情可能就是程序发生了崩溃(异常),这时Windows会提示该程序执行了非法操作,即将关闭.请与您的供应商联系.呵呵,这句微软的“名 ...

  4. Delphi通过Map文件查找内存地址出错代码所在行

    一 什么是MAP文件 什么是 MAP 文件?简单地讲, MAP 文件是程序的全局符号.源文件和代码行号信息的唯一的文本表示方法,它可以在任何地方.任何时候使用,不需要有额外的程序进行支持.而且,这是唯 ...

  5. 问题-[Delphi]通过Map文件查找内存地址出错代码所在行

     一 什么是MAP文件       什么是 MAP 文件?简单地讲, MAP 文件是程序的全局符号.源文件和代码行号信息的唯一的文本表示方法,它可以在任何地方.任何时候使用,不需要有额外的程序进行支持 ...

  6. dump文件定位程序崩溃代码行

    1.dump文件 2.程序对应的pdb 步骤一:安装windbg 步骤二:通过windbg打开crash dump文件 步骤三:设置pdb文件路径,即符号表路径 步骤四:运行命令!analyze -v ...

  7. 使用MAP文件快速定位程序崩溃代码行 (转)

    使用MAP文件快速定位程序崩溃代码行 =========================================================== 作者: lzmfeng(http://lz ...

  8. VS2008通过 map 和 cod 文件定位崩溃代码行

    VS 2005/2008使用map文件查找程序崩溃原因 一般程序崩溃可以通过debug,找到程序在那一行代码崩溃了,最近编一个多线程的程序,都不知道在那发生错误,多线程并发,又不好单行调试,终于找到一 ...

  9. Win32环境下的程序崩溃异常定位

    1       案例描述 作为Windows程序员,平时最担心见到的事情可能就是程序发生了崩溃(异常),这时Windows会提示该程序执行了非法操作,即将关闭.请与您的供应商联系.呵呵,这句微软的“名 ...

随机推荐

  1. ArcGIS JS 之通过代理配置ArcGIS Server服务 token

    ArcGIS JS 代理 1.ArcGIS Server Manager中配置访问服务的用户名.密码.角色等,并配置地图服务的具体角色名称 2.在ArcGIS JS中配置使用代理,下述代码将esri的 ...

  2. (一)Django项目的目录结构

    1.将app放在apps文件夹中,将改文件夹设置为 source root,便于引用.两个app不可以互相引用,可以利用第三个app实现一些操作. 2.将一些多媒体文件放在media中的相应app名称 ...

  3. LOJ2484 CEOI2017 Palindromic Partitions DP、回文树

    传送门 当我打开Luogu题解发现这道题可以Hash+贪心的时候我的内心是崩溃的-- 但是看到这道题不都应该认为这是一道PAM的练手好题么-- 首先把原字符串重排为\(s_1s_ks_2s_{k-1} ...

  4. Web应用和Web框架

    一.Web应用 二.Web框架 三.wsgiref模块 一.Web应用 1.什么是Web应用? Web应用程序是一种可以通过Web访问的应用程序,特点是用户很容易访问,只需要有浏览器即可,不需要安装其 ...

  5. 学了python能干什么

    学了python能做些什么 1.WEB开发 Python拥有很多免费数据函数库.免费web网页模板系统.以及与web服务器进行交互的库,可以实现web开发,搭建web框架,目前比较有名气的Python ...

  6. 定时任务 Quarzt

    Quartz.Net是一个从java版的Quartz移植过来的定时任务框架,可以实现异常灵活的定时任务. Quartz 有三个概念分别是 计划者(ISchedeler).工作(IJob).触发器(Tr ...

  7. 分享个免费的svn平台

    平时在工作中难免会用到svn,但是要自己搭建一个,未免成本太高,近来,本人接触到一个免费的svn平台(可能大神们早就发现了),个人使用还是足够了. 地址:https://svnbucket.com 相 ...

  8. vue watch 的简单使用

    在项目开发中遇到的需求,这点写第一个dome 监听父组件传过来的值发送变化 在子组件中 <template> <div class="components"> ...

  9. HelloWorld! C++纠错版

    例题:1 #include<iostream> int main() { cout << "HelloWorel!" ; ; } #include < ...

  10. HTML学习摘要2

    DAY 2 HTML 标签可以拥有属性.属性提供了有关 HTML 元素的更多的信息. 属性总是以名称/值对的形式出现,比如:name="value". 属性总是在 HTML 元素的 ...