Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[cdt-debug-dev] A race condition in CBreakpointManager

Hi All
  We have implemented cdt-cdi based multicore debug support  and occasionally  we are seeing a race condition while break points are inserted during a multi-core debug session. When a breakpoint is inserted that gets planted on both targets ,but occasionally one of them is getting deleted . CBreakpointManager's  breakpointsChanged() and  doHandleLocationBreakpointCreatedEvent() are the two methods involved in this issue . Even though cdt currently does not have multicore debug support this race condition can be  simulated using  two launches at the same time. So I am explaining using two launches.

1. Put a breakpoint  inside  CBreakpointManagers's doHandleLocationBreakpointCreatedEvent method at  Line No 550 (where BreakpointProblems.removeProblemsForResolvedBreakpoint(breakpoint, getDebugTarget().getInternalID()) is there )

2.From CDT runtime launch any program  for debug two time (  Now two launches are active which is similar to a multi core debug situation)  I am suggesting same program because same breakpoint  becomes valid for both.

3.Now put a  breakpoint in the c program that we just launched (say in main.c at line 190 )

4. Now in the  eclipse debug view you can see two threads waiting at the breakpoint we planted earlier . They are two CBreakpointManager's of two launches . Lets say  L1 CBreakpointManager and L2 CBreakpointManager

5. Resume any one thread  and after few seconds the other too. Now if you look at the debug trace you can see one of targets breakpoint got removed.
------------------------------------------------------------------------------------------------------------------------------------------------------------------
[1,247,289,996,214] 113-break-insert main.c:190
[1,247,289,996,217] 113^done,bkpt={number="2",type="breakpoint",disp="keep",enabled="y",addr="0x0804\
87aa",func="main",file="../src/main.c",fullname="/home/ide/workspaces/eclipse/ws_cdt_cdi_mi_head_run\
time/VariableS/src/main.c",line="190",times="0"}
[1,247,289,996,217] (gdb)
[1,247,289,996,262] 114-break-insert main.c:190
[1,247,289,996,266] 114^done,bkpt={number="2",type="breakpoint",disp="keep",enabled="y",addr="0x0804\
87aa",func="main",file="../src/main.c",fullname="/home/ide/workspaces/eclipse/ws_cdt_cdi_mi_head_run\
time/VariableS/src/main.c",line="190",times="0"}
[1,247,289,996,267] (gdb)
[1,247,290,007,586] 115-break-delete 2
[1,247,290,007,588] 115^done
[1,247,290,007,589] (gdb)
------------------------------------------------------------------------------------------------------------------------------------------------------------------

 When  one thread is resumed say L1 CBreakpointManger it updates the breakpoint by setting the target filter and fires breakpoint
updated event. Both of the CBreakpintMangers recives this event, and process it in breakpointsChanged() method,where it checks for breakpoints target filter to see this breakpoint should be removed or not .  

CBreakpointManager Line no 355    ICDebugTarget[] tfs = getFilterExtension(b).getTargetFilters();

Now the L1 's breakpointsChanged() can find the respective target and it will not remove . But L2's breakpointsChanged() will not find the respective target as L2's  doHandleLocationBreakpointCreatedEvent() is not finished setting the target list in the breakpoint (CBreakpointManager Line no 551 getFilterExtension(breakpoint).setTargetFilter( getDebugTarget() ); ) . So it adds this breakpoint to the remove list.

I know in vanila cdt this won't be a big issue , but did anyone else who have multicore launch face this ?

The obvious and easy solution is to synchronize access. But can anyone suggest  better solution ?


Thanks
Shaiju.P

Back to the top