From e6f542d42b566193f55bb6727834f709ac6c1762 Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Sat, 25 Aug 2012 20:12:45 +0300 Subject: [PATCH] Retain user-set breakpoints and send them to the process on startup --- source/gldbg.cpp | 37 ++++++++++++++++++++++++++----------- source/gldbg.h | 3 +++ 2 files changed, 29 insertions(+), 11 deletions(-) diff --git a/source/gldbg.cpp b/source/gldbg.cpp index c37e655..dd0476d 100644 --- a/source/gldbg.cpp +++ b/source/gldbg.cpp @@ -79,7 +79,19 @@ void GlDbg::launch() process.launch(); close(fds[1]); - breakpoints.clear(); + for(BreakList::iterator i=breakpoints.begin(); i!=breakpoints.end(); ) + { + if(i->has_owner(0)) + { + i->owners.clear(); + i->owners.push_back(0); + send_breakpoint(i->function, i->flag, 0); + ++i; + } + else + breakpoints.erase(i++); + } + for(ToolList::iterator i=tools.begin(); i!=tools.end(); ++i) (*i)->process_started(); } @@ -95,6 +107,15 @@ void GlDbg::hold() send(pkt); } +void GlDbg::send_breakpoint(unsigned short func, unsigned char set_flags, unsigned char clear_flags) +{ + GlPacket *pkt = packet_begin(FUNC_GLDBREAK); + packet_write_short(pkt, func); + packet_write_char(pkt, set_flags); + packet_write_char(pkt, clear_flags); + send(pkt); +} + void GlDbg::set_breakpoint(unsigned short func, unsigned char flag, Tool *owner) { Breakpoint *bp = (func ? get_breakpoint(func, flag) : 0); @@ -108,11 +129,8 @@ void GlDbg::set_breakpoint(unsigned short func, unsigned char flag, Tool *owner) breakpoints.back().add_owner(owner); } - GlPacket *pkt = packet_begin(FUNC_GLDBREAK); - packet_write_short(pkt, func); - packet_write_char(pkt, flag); - packet_write_char(pkt, 0); - send(pkt); + if(process.get_state()>=Process::RUNNING) + send_breakpoint(func, flag, 0); } } @@ -135,11 +153,8 @@ void GlDbg::clear_breakpoint(unsigned short func, unsigned char flag, Tool *owne break; } - GlPacket *pkt = packet_begin(FUNC_GLDBREAK); - packet_write_short(pkt, func); - packet_write_char(pkt, 0); - packet_write_char(pkt, flag); - send(pkt); + if(process.get_state()>=Process::RUNNING) + send_breakpoint(func, 0, flag); } } } diff --git a/source/gldbg.h b/source/gldbg.h index 36ca1df..3a2bcd1 100644 --- a/source/gldbg.h +++ b/source/gldbg.h @@ -55,6 +55,9 @@ public: void launch(); void send(GlPacket *); void hold(); +private: + void send_breakpoint(unsigned short, unsigned char, unsigned char); +public: void set_breakpoint(unsigned short, unsigned char, Tool *); void clear_breakpoint(unsigned short, unsigned char, Tool *); void resume_from_break(Tool *); -- 2.45.2