锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
瑕佹兂杈懼埌榪欐牱鐨勭洰鐨勶紝棣栧厛瑕佽繘琛屼竴浜涘伐紼嬪睘鎬х殑閰嶇疆銆?/p>
c/c++->甯歌->璋冭瘯淇℃伅鏍煎紡->紼嬪簭鏁版嵁搴?br>c/c++->浼樺寲->浼樺寲->紱佺敤
閾炬帴鍣?>璋冭瘯->鐢熸垚璋冭瘯淇℃伅->鏄?br> ->鐢熸垚鏄犲皠鏂囦歡->鏄?br> ->鏄犲皠鏂囦歡鍚嶇О->$(OutDir)/$(ProjectName).map
->鏄犲皠瀵煎嚭->鏄?br> ->鏄犲皠琛?>鏄?/p>
1 int main (int argc, char* argv[])
2 {
3 char * p = 0;
4 *p = 'c';
5 return 0;
6 }
褰撴墽琛岀▼搴忕殑鏃跺欙紝鏄劇ず“test1.exe涓殑0x0040100e澶勬湭澶勭悊鐨勫紓甯革細(xì)0xc000005:鍐欏叆浣嶇疆0x00000000鏃跺彂鐢熻闂啿紿?#8221;
榪欎釜鏃跺欐潵鐪嬩竴涓媘ap鏂囦歡銆傞鍏堢湅鍒扮殑鏄弬鑰冪殑鍔犺澆鍦板潃錛?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鍦板潃璁$畻錛歝alculation: crash_address - preferred_load_address - 0x1000
0x0040100e -0x00400000-0x1000=0x0000000e
鎺ョ潃鍦╩ap涓煡鎵懼搴旂殑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
鏈鍚庢牴鎹畂bj鍜岃綆楃殑鍊煎湪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涓煡鎵劇涓涓皬浜庢垜浠墍璁$畻鐨勫肩殑浣嶇疆
鎵浠ユ垜浠殑涓柇浣嶇疆鏄湪絎?琛?br>
鎵ц.exr 0xb5f78
鎵ц.cxr 0x45235
鎵ц.kb灝卞彲浠ヨ繕鍘熷爢鏍堜俊鎭簡(jiǎn)
/**/
/*
*******************************************************************
*聽Copyright聽(c)聽2006,study-record聽home
*聽All聽rights聽reservered.
*
*聽鏂囦歡鍚嶇О聽:聽littersize.cpp聽
*聽鎽樎犅犅犅犺聽:聽榪欎釜渚嬪瓙涓昏鏄敤鏉ラ獙璇佽繖鏍蜂竴涓棶棰樸傚綋鎴戜滑紼嬪簭涓湁n涓猺eactor鐨勬椂鍊欙紝鏄惁灝辨剰鍛崇潃鎴戜滑鏀寔n*FD_SETSIZE榪炴帴.
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽涓轟簡(jiǎn)楠岃瘉榪欎釜闂,鎴戜滑浼犻掍竴涓ぇ灝忎負(fù)2鐨勫肩粰ACE_Select_Reactor鐨勬瀯閫犲嚱鏁般傜湅鏄惁鏄彧鏀寔2涓繛鎺?
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽楠岃瘉緇撴灉琛ㄦ槑錛氬湪鏈緥瀛愪腑錛岀敱浜巃cceptor娉ㄥ唽鐢ㄦ帀浜?jiǎn)涓涓紝鑰屾垜浠粰瀹氱殑鏈澶х殑handle鏁頒負(fù)2,鎵浠ュ彧鑳芥帴鍙椾竴涓繛鎺ャ?br />
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽鍦ㄥ懡浠よ涓嬭緭鍏ワ細(xì)telnet聽127.0.0.1聽1234聽,鍦ㄦ垜浠浜屾杈撳叆鏃訛紝
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽鍦ㄨ皟鐢╥nt聽nRet聽=聽m_Reactor->register_handler(pEvent,聽ACE_Event_Handler::READ_MASK);鐨勬椂鍊欎竴瀹氫細(xì)澶辮觸銆?br />
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽浣嗘槸鍦ㄥ懡浠よ涓嬭緭鍏?telnet聽127.0.0.1聽2345聽,鍦ㄦ垜浠涓夋杈撳叆鐨勬椂鍊欙紝璋冪敤register_handler鐨勬椂鍊欐墠浼?xì)澶辫?br />
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽浣嗘槸榪欐牱鐨勪竴孌典唬鐮佸瓨鍦ㄩ珮cpu鐨勯棶棰橈紝涔熷氨鏄綋鎶婂鎴風(fēng)鍏寵皟鐨勬椂鍊欙紝cpu鍗犵敤鐜囦細(xì)寰堥珮?鎯蟲兂鐪嬶紝涓轟粈涔堝憿錛?br />
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽鏈唬鐮佸彧鏄負(fù)浜?jiǎn)楠岃瘉涓浜涗笢瑗匡紝鏈夊緢澶氫笉鍚堢悊鐨勫湴鏂癸紝璇峰姟浠跨収銆?br />
*
*聽褰撳墠鐗堟湰聽:聽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();
}
| 聽 |