如题. 这个错误地址和.map文件中的地址对应不起来啊, - $400100后也不对. 具体是个什么对应关系呢?

解决方案 »

  1.   

    看看这个吧,可以的,我试过,不过有点麻烦。
    你不如先确定是那个函数除了问题,然后单步执行,这样比较方便。
    //********************************************************************************
    以前看了  通过崩溃地址找错误行数之VC版  那时候还没用DELPHI  
    昨晚刚好又看到了  所以就试了一下DELPHI的,与大家共享  ^_^  
     什么是  MAP  文件?简单地讲,  MAP  文件是程序的全局符号、源文件和代码行号信息的唯一的文本表示方法,它可以在任何地方、任何时候使用,不需要有额外的程序进行支持。而且,这是唯一能找出程序崩溃的地方的救星。  
    DELPHI下生成MAP文件的方法:偶只知道下面两种,如果谁知道其他的方法  敬请告知  多谢  
    生成详细的MAP信息的方法
    您好:最近我常常觉得恶心,呕吐,而且会吐出一些血丝,
    一般都发生在早晨起床时,好像都是胃里没食物的时候,
    能说说这是怎么回事嘛?谢谢了!~
    1.  project  ->  options  ->  Linker  ->  Map  file  选择detailed.  
    2.  D:\Fred\Code\DELPHI\MyPas\ErrLineByAddr2>dcc32  -GD  project1.dpr  
    想必大家看到了  会有返回0地址错误....我们这里就是要让它崩溃,让我让你崩溃  ^_^  
    然后执行  点击  然后出错  我的机器上  崩溃地址为0044d946    
    如果要查找代码行号,需要使用下面的公式做一些十六进制的减法运算:  
    崩溃行偏移= 崩溃地址(Crash  Address)-基地址(ImageBase  Address)-0x1000    
    减去后得到0004c946然后查找0004c946    
    0044d946-00400000=0004d946-00001000=0004c946<=  后面列出的    
    0004C946就是它了  我们用ultraedit32之类的工具打开.map文件搜索0004C94,找到了,然后就找0004c946的那个地址然后看到了  
    Line  numbers  for  Unit1(Unit1.pas)  segment  .text  
     
           37  0001:0004C944        38  0001:0004C946        39  0001:0004C949        41  0001:0004C97C  
           41  0001:0004C983  
    //*************************************************************************************
      

  2.   

    exe中代码直接出错可以找到了, 不过如果是调用某个dll出错的话还是无法定位到具体哪行调用造成的. 谁知道在这种情况下如何获取整个的函数调用链? 难道只有用汇编从当前堆栈[EBP-8]获取上一级返回地址并通过[EBP-4]不断遍历下去? 如果是这样的话那么怎么判断已经达到最顶层了?PS: 
    单步调试并不是万能的. 很多情况下是无法通过单步调试找出错误的, 最简单的情况就是你无法用单步来调试牵涉屏幕重绘的代码. 只要你进入单步, 你能抓到的永远是断点那句而根本跟踪不到断点后面一句, 因为断点时切换回delphi了, 一出断点又造成窗口重绘又会再次断点进delphi--而且就是刚才那个断点.另外开发多线程或定时器敏感的程序也多半无法用单步, 这时只有通过输出log来检查代码运行情况, 而log到的exception我希望能够直接定位到具体出错行, 至少也要能很方便地找到出错行.