c++ Òì³£´¦Àí£¨1£©(ËÄ)

2014-11-24 10:57:09 ¡¤ ×÷Õß: ¡¤ ä¯ÀÀ: 3
ibstdc++.so.6
#3 0x08048979 in test_func3 () at exc.cc:6
#4 0x080489ac in test_func2 () at exc.cc:16
#5 0x08048a52 in test_func1 () at exc.cc:29
#6 0x08048ad1 in main () at exc.cc:39
(gdb)
¸´ÖÆ´úÂë
´ÓÕâ¸öµ÷ÓÃÕ»¿ÉÒÔ¿´³ö£¬Òì³£Å׳öºó£¬ÎÒÃǵijÌÐò¶¼×öÁËЩʲô¡£Èç¹ûÄã¾õµÃºÃÍæ£¬ÄãÉõÖÁ¿ÉÒÔ³¢ÊÔÈ¥hookµôÆäÖÐijЩº¯Êý£¬´Ó¶ø¸Ä±äÒì³£´¦ÀíµÄÐÐΪ£¬ÕâÖÖhackµÄ¼¼ÇÉÔÚijЩʱºòÊǺÜÓÐÓõ쬱ÈÈç˵ÎÒÏÖÔÚÓõ½µÄÒ»¸ö³¡¾°£º
ÎÒÃÇʹÓÃÁËÒ»¸öµÚÈý¿â£¬Õâ¸ö¿âÀïÓÐÒ»¸öÏûϢѭ»·£¬ËüÊÇ·ÅÔÚÒ»¸ötry/catchÀïÃæµÄ¡£
¸´ÖÆ´úÂë
void wxEntry()
{
try
{
call_user_func();
}
catch(...)
{
unhandled_exception();
}
}
¸´ÖÆ´úÂë
call_user_func()»áµ÷ÓÃһϵÁеĺ¯Êý£¬ÆäÖÐÉæ¼°ÎÒÃÇ×Ô¼ºÐ´µÄ´úÂ룬ÔÚijЩʱºòÎÒÃǵĴúÂëÅ×Òì³£ÁË£¬¶øÇÒÎÒÃÇûÓв¶×½×¡£¬Òò´ËwxEntryÀï×îÖÕ»ácatchס£¬µ÷ÓÃunhandled_exception(), Õâ¸öº¯ÊýĬÈϵ÷ÓÃһЩÇåÀíº¯Êý£¬È»ºó°Ñ³ÌÐòabort£¬¶øÔÚµ÷ÓÃÇåÀíº¯ÊýµÄʱºò£¬ÓÉÓÚÎÒÃǵĴúÂëÒѾ­ÐÐΪ²»Õý³£ÁË£¬ÔÚÖÖÇé¿öÏÂÈ¥ÇåÀíͨ³£ÓÖ»áÒý³öºÜ¶àÆäËüµÄÆæÆæ¹Ö¹ÖµÄ´íÎó£¬×îºó¾ÍËãµÃµ½ÁËcoredumpÒ²ºÜÄÑÅжϳöÎÒÃǵijÌÐòÄÄÀï³öÁËÎÊÌâ¡£ËùÒÔÎÒÃÇÏ£Íûµ±ÎÒÃǵĴúÂëÅ׳öÒì³£ÇÒûÓб»ÎÒÃÇ×Ô¼º´¦Àí¶øÔÚwxEntry()Öб»²¶×½Á˵ϰ£¬ÎÒÃÇ¿ÉÒÔ°ÑÅ×Òì³£µÄµØ·½µÄµ÷ÓÃÕ»¸ø´ò³öÀ´¡£
Ò»¿ªÊ¼ÎÒÃdz¢ÊÔ°Ñ__cxa_throw¸øhookÁË£¬Ò²¾ÍÊÇÿµ±ÓÐÈËÒ»Å×Òì³££¬ÎÒÃǾͰѵ±Ê±µÄµ÷ÓÃÕ»¸ø´ò³öÀ´£¬Õâ¸ö·½°¸¿ÉÒÔ½â¾öÎÊÌ⣬µ«ÊÇÎÊÌâºÜÃ÷ÏÔ£¬ËüÓ°ÏìÁËËùÓÐÅ×Òì³£µÄ´úÂëµÄÖ´ÐÐЧÂÊ£¬±Ï¾¹ÊÕ¼¯µ÷ÓÃÕ»Ïà¶ÔÀ´ËµÊDZȽϷÑʱµÄ¡£
ÆäʵÎÒÃDz¢Ã»±ØÒª¶Ôÿ¸öthrow¶¼È¥´¦Àí£¬ÎÊÌâµÄ¹Ø¼ü¾ÍÔÚÓÚÎÒÃÇÄܲ»ÄÜʶ±ð³öÎÒÃÇËùÏëÒª´¦ÀíµÄÒì³£¡£
ÔÚÕâ¸ö°¸ÀýÖУ¬ÎÒÃÇǡǡ¿ÉÒÔ£¬ÒòΪËùÓÐû±»´¦ÀíµÄÒì³££¬×îÖÕ¶¼»áͳһÉÏÅ×µ½wxEntryÖУ¬ÄÇôÎÒÃÇÖ»ÒªhookÒ»ÏÂpersonality routine£¬¿´¿´µ±Ç°unwindµÄÊDz»ÊÇwxEntry²»¾Í¿ÉÒÔÁËÂð£¡
¸´ÖÆ´úÂë
#include
#include
#include
#include
#include
using namespace std;
void test_func1();
static personality_func gs_gcc_pf = NULL;
static void hook_personality_func()
{
gs_gcc_pf = (personality_func)dlsym(RTLD_NEXT, "__gxx_personality_v0");
}
static int print_call_stack()
{
//to do.
}
extern "C" _Unwind_Reason_Code
__gxx_personality_v0 (int version,
_Unwind_Action actions,
_Unwind_Exception_Class exception_class,
struct _Unwind_Exception *ue_header,
struct _Unwind_Context *context)
{
_Unwind_Reason_Code code = gs_gcc_pf(version, actions, exception_class, ue_header, context);
if (_URC_HANDLER_FOUND == code)
{
//ÕÒµ½ÁËcatchËùÓеĺ¯Êý
//µ±Ç°º¯ÊýÄÚµÄÖ¸ÁîµÄµØÖ·
void* cur_ip = (void*)(_Unwind_GetIP(context));
Dl_info info;
if (dladdr(cur_ip, &info))
{
if (info.dli_saddr == &test_func1)
{
// µ±Ç°º¯ÊýÊÇÄ¿±êº¯Êý
print_call_stack();
}
}
}
return code;
}
void test_func3()
{
char* p = new char[2222222222222];
cout << "test func3" << endl;
}
void test_func2()
{
cout << "test func2" << endl;
try
{
test_func3();
}
catch (int)
{
cout << "catch 2" << endl;
}
}
void test_func1()
{
cout << "test func1" << endl;
try
{
test_func2();
}
catch (...)
{
cout << "catch 1" << endl;
}
}
int main()
{
hook_personality_func();
test_func1();
return 0;
}