一动不如一静

C++博客 首页 新随笔 联系 聚合 管理
  20 Posts :: 0 Stories :: 10 Comments :: 0 Trackbacks

#

http://www.microsoft.com/msj/0298/hood0298.aspx

posted @ 2008-02-23 18:10 一动不如一静 阅读(556) | 评论 (0)编辑 收藏

有时候我们的程序crash了,会出现一个crash界面提示我们在什么位置中断了。我们如何根据这个中断地址找到对应的行号呢?

要想达到这样的目的,首先要进行一些工程属性的配置。

c/c++->常规->调试信息格式->程序数据库
c/c++->优化->优化->禁用
链接器->调试->生成调试信息->是
            ->生成映射文件->是
            ->映射文件名称->$(OutDir)/$(ProjectName).map
            ->映射导出->是
            ->映射行->是

1    int main (int argc, char* argv[])
2   {
3       char * p = 0;
4       *p = 'c';
5       return 0;
6 }

当执行程序的时候,显示“test1.exe中的0x0040100e处未处理的异常:0xc000005:写入位置0x00000000时发生访问冲突”


这个时候来看一下map文件。首先看到的是参考的加载地址: Preferred load address is 00400000

Timestamp is 4639462c (Thu May 03 10:17:16 2007)

 Preferred load address is 00400000

 Start         Length     Name                   Class
 0001:00000000 00003b58H .text                   CODE
 0002:00000000 000000c4H .idata$5                DATA
 0002:000000d0 00000c40H .rdata                  DATA
 0002:00000d10 00000048H .rdata$debug            DATA
 0002:00000d60 00000008H .rdata$sxdata           DATA
 0002:00000d68 00000004H .rtc$IAA                DATA
 0002:00000d6c 00000004H .rtc$IZZ                DATA
 0002:00000d70 00000004H .rtc$TAA                DATA
 0002:00000d74 00000004H .rtc$TZZ                DATA
 0002:00000d78 00000014H .idata$2                DATA
 0002:00000d8c 00000014H .idata$3                DATA
 0002:00000da0 000000c4H .idata$4                DATA
 0002:00000e64 00000366H .idata$6                DATA
 0002:000011ca 00000000H .edata                  DATA
 0003:00000000 00000004H .CRT$XCA                DATA
 0003:00000004 00000004H .CRT$XCAA               DATA
 0003:00000008 00000004H .CRT$XCZ                DATA
 0003:0000000c 00000004H .CRT$XIA                DATA
 0003:00000010 00000008H .CRT$XIC                DATA
 0003:00000018 00000004H .CRT$XIZ                DATA
 0003:0000001c 00000004H .CRT$XPA                DATA
 0003:00000020 00000004H .CRT$XPZ                DATA
 0003:00000024 00000004H .CRT$XTA                DATA
 0003:00000028 00000004H .CRT$XTZ                DATA
 0003:00000030 00000274H .data                   DATA
 0003:000002c0 00000598H .bss                    DATA

crash地址计算:calculation: crash_address - preferred_load_address - 0x1000
                            0x0040100e -0x00400000-0x1000=0x0000000e

接着在map中查找对应的obj

 Address         Publics by Value              Rva+Base     Lib:Object

 0000:00000000       __except_list              00000000     <absolute>
 0000:00000002       ___safe_se_handler_count   00000002     <absolute>
 0001:00000000       _main                      00401000 f   test1.obj
 0001:00000017       __amsg_exit                00401017 f   LIBC:crt0.obj
 0001:0000003c       _mainCRTStartup            0040103c f   LIBC:crt0.obj
 0001:00000203       ___crtExitProcess          00401203 f   LIBC:crt0dat.obj


最后根据obj和计算的值在map中找第一个小于我们所计算的值的位置

Line numbers for .\release\test1.obj(d:\test\test1\test1\test1.cpp) segment .text

     2 0001:00000000     3 0001:00000004     4 0001:0000000b     5 0001:00000011

然后在.map中查找第一个小于我们所计算的值的位置

所以我们的中断位置是在第4行

posted @ 2007-05-03 10:44 一动不如一静 阅读(1518) | 评论 (3)编辑 收藏

Hummingbird connectivity
posted @ 2007-03-07 23:29 一动不如一静 阅读(203) | 评论 (0)编辑 收藏

首先用~*kb,察看所有的线程
然后寻找Filter关键字所在的线程,假设出问题的线程为12,.

首先将线程2设置为当前线程: ~2s
因为XcpFilter的结构体中,第2个参数表示异常信息的指针,第3个参数是上下文的指针。
假设args to child
    0x0001 0xb5f78 0x45235

执行.exr 0xb5f78
执行.cxr 0x45235

执行.kb就可以还原堆栈信息了

posted @ 2007-03-07 23:17 一动不如一静 阅读(4919) | 评论 (0)编辑 收藏

     摘要: ACE_TP_Reactor::ACE_TP_Reactor (size_t max_number_of_handles,                                 int  restart,                                ACE_Sig_Handler  * sh,                   ...  阅读全文
posted @ 2007-02-25 20:41 一动不如一静 阅读(2244) | 评论 (0)编辑 收藏

     摘要: 首先从定义一个reactor开始。ACE_TP_Reactor select_reactor_one(g_unOneMaxHandle, 0, 0, 0, 1); 上面的这句话触发了一下的一些行为。主要就是给event_handlers_分配了内存。这里就决定了你能支持多少条连接 int ACE_Select_React...  阅读全文
posted @ 2007-02-24 20:30 一动不如一静 阅读(1755) | 评论 (0)编辑 收藏

 

/* *******************************************************************
* Copyright (c) 2006,study-record home
* All rights reservered.
*
* 文件名称 : littersize.cpp 
* 摘    要 : 这个例子主要是用来验证这样一个问题。当我们程序中有n个reactor的时候,是否就意味着我们支持n*FD_SETSIZE连接.
                   为了验证这个问题,我们传递一个大小为2的值给ACE_Select_Reactor的构造函数。看是否是只支持2个连接?
                   验证结果表明:在本例子中,由于acceptor注册用掉了一个,而我们给定的最大的handle数为2,所以只能接受一个连接。
                   在命令行下输入:telnet 127.0.0.1 1234 ,在我们第二次输入时,
                   在调用int nRet = m_Reactor->register_handler(pEvent, ACE_Event_Handler::READ_MASK);的时候一定会失败。
                   但是在命令行下输入:telnet 127.0.0.1 2345 ,在我们第三次输入的时候,调用register_handler的时候才会失败
                   但是这样的一段代码存在高cpu的问题,也就是当把客户端关调的时候,cpu占用率会很高?想想看,为什么呢?
                   本代码只是为了验证一些东西,有很多不合理的地方,请务仿照。
*
* 当前版本 : 1.0
* 作    者 : study-record   2007-2-22
*
********************************************************************
*/


#include 
" ace/Thread_Manager.h "
#include 
" ace/Select_Reactor.h "
#include 
" ace/Reactor.h "
#include 
" ace/Event_Handler.h "
#include 
" ace/SOCK_Acceptor.h "
#include 
" ace/SOCK_Stream.h "
#include 
" ace/INET_Addr.h "

const  size_t g_unOneMaxHandle  =   2 ;
const  size_t g_unTwoMaxhandle  =   4 ;


static  ACE_THR_FUNC_RETURN event_loop_one ( void   * arg) 
{
    ACE_Reactor 
* reacator  =  static_cast < ACE_Reactor  *> (arg);

    reacator
-> owner(ACE_Thread::self());
    reacator
-> run_reactor_event_loop();
    
return   0 ;

}

static  ACE_THR_FUNC_RETURN event_loop_two ( void   * arg) 
{
    ACE_Reactor 
* reacator  =  static_cast < ACE_Reactor  *> (arg);

    reacator
-> owner(ACE_Thread::self());
    reacator
-> run_reactor_event_loop();
    
return   0 ;
}


class  TestHandleEvent:  public  ACE_Event_Handler
{
public :
    
virtual   int  handle_input (ACE_HANDLE fd  =  ACE_INVALID_HANDLE)
    
{
        ACE_DEBUG((LM_DEBUG, 
" TestHandleEvent::handle_input\n " ));
        
return   0 ;
    }
;
    
virtual   int  handle_close (ACE_HANDLE handle, ACE_Reactor_Mask close_mask)
    
{
        
        ACE_DEBUG((LM_DEBUG, 
" TestHandleEvent::handle_close\n " ));
        delete 
this ;
        
return   0 ;

    }
;
    ACE_HANDLE get_handle(
void const  
    
{
        
return  peer.get_handle();
    }


public :
    ACE_SOCK_Stream peer;

}
;
class  TestAcceptor :  public  ACE_Event_Handler
{
public :
    
virtual   int  handle_input (ACE_HANDLE fd  =  ACE_INVALID_HANDLE)
    
{
        
        TestHandleEvent
*  pEvent  =   new  TestHandleEvent;
        acceptor.accept(pEvent
-> peer);
        
int  nRet  =  m_Reactor -> register_handler(pEvent, ACE_Event_Handler::READ_MASK);
        
if  ( - 1   ==  nRet)
        
{
            delete pEvent;
            pEvent 
=  NULL;
        }


        
return   0 ;
    }
;
    
virtual   int  handle_close (ACE_HANDLE handle, ACE_Reactor_Mask close_mask)
    
{
        ACE_DEBUG((LM_DEBUG, 
" TestAcceptor::handle_close\n " ));
        acceptor.close();
        delete 
this ;

        
return   0 ;

    }
;
    
    
    TestAcceptor(ACE_Reactor
*  reactor):m_Reactor(reactor)
    
{
        
    }
;
    
int  open(unsigned  short  usport)
    
{
        ACE_INET_Addr addr(usport);
        acceptor.open(addr);
        
return  m_Reactor -> register_handler( this , ACE_Event_Handler::ACCEPT_MASK);

    }
;
    ACE_HANDLE get_handle(
void const  
    
{
        
        
return  acceptor.get_handle();
    }

public :
    ACE_SOCK_Acceptor acceptor;
    ACE_Reactor
*  m_Reactor;

}
;


int  main ( int  argc,  char   * argv[])
{
    

    ACE_Select_Reactor select_reactor_one(g_unOneMaxHandle, 
0 0 0 1 );
    ACE_Reactor
*  reactor_one  =   new  ACE_Reactor( & select_reactor_one);

    ACE_Select_Reactor select_reactor_two(g_unTwoMaxhandle, 
0 0 0 1 );
    ACE_Reactor
*  reactor_two  =   new  ACE_Reactor( & select_reactor_two);

    TestAcceptor test_acceptor(reactor_one);
    test_acceptor.open(
1234 );

    TestAcceptor test_acceptorw(reactor_two);
    test_acceptorw.open(
2345 );
    
    
    ACE_Thread_Manager::instance()
-> spawn(event_loop_one, reactor_one);
    ACE_Thread_Manager::instance()
-> spawn(event_loop_two, reactor_two);

    
return  ACE_Thread_Manager::instance() -> wait();
}
posted @ 2007-02-22 23:25 一动不如一静 阅读(829) | 评论 (0)编辑 收藏

近来在工作中总是会有一些dump文件需要分析,但是自己对windug十分陌生。所以就想自己产生几个coredump文件,然后学习着用windug进行分析。虽然有了这个想法,但是不知道怎么才能在windows上产生coredump文件。于是抱着试试的想法,搜索了一下,结果还真让我给搜到了。
在以下的这个网址讲述了如何在xp和2000上如何设置?
http://publib.boulder.ibm.com/infocenter/wasinfo/v4r0/index.jsp?topic=/com.ibm.support.was40.doc/html/Crash/swg21113013.html

现在我呢,就做了搬运工,搬到这里^_^。

Solution
  1. Open a command prompt window.

  2. Enter the command drwtsn32.exe.

    The following window will display:
    • For Windows 2000:



    • For Windows XP:



  3. In the Log File Path field, type the location to where you want the DrWatson log to be stored.

  4. In the Crash Dump field, type the file name and location where you want the user.dmp file to be stored.

  5. Make sure that the following options are selected:
    1. Dump Symbol Table
    2. Dump All Thread Contents
    3. Visual Notification
    4. Create Crash Dump File

  6. If you are running Windows XP, set Crash Dump Type to NT4 Full Compatible.

  7. From a command prompt, enter drwtsn32 -i to re-enable Dr. Watson as your default Windows debugger. This will make the necessary changes in the Windows registry.
 


 






posted @ 2006-12-10 12:52 一动不如一静 阅读(3920) | 评论 (0)编辑 收藏

1.定位进程到底是挂在哪里
  psstack 进程ID > 文件名称
       cat 文件名称 | c++filt > 其他的文件   
2.   snoopy抓包
     a.先用ifconfig查出设备名称,假设为bge0
    b. snoop -d bge0 -o 文件文成 目的机器的IP地址
    c.snoopy from ip地址 to ip地址
  
   3.抓dump包之后用windug分析。这里的学问就大了。目前正在学习中
posted @ 2006-12-09 20:04 一动不如一静 阅读(392) | 评论 (0)编辑 收藏

一直对异步IO怀有恐惧之心,所以到现在也没有仔细的去研究过,但是老师怎么告诉我们说要用于面对困难,所以决定坐下来研究一下,看看到底有多高深,不向困难低头^_^

资源:http://www.zahui.com/html/9/35437.htm
posted @ 2006-10-07 13:57 一动不如一静 阅读(512) | 评论 (0)编辑 收藏

仅列出标题
共2页: 1 2