VMware, Inc. 4
Replay Debugging on Linux
Yourprogramisnowatitsfirstexecutableruntimeinstruction(note–beforemain),andreadytorun.Ifyou
wanttogotomain,typebreakmain,andthentypecontinue.
Fromthispoint,youcansetbreakpoints,printvariables,examinevariables,displayregisters,step,next,and
continue,muchasifyo
uwe
redebugginganativeprocessonyourhost.Theoneprincipalthingyoucannot
doischangeanything!Becauseyouaredebuggingarecording,andnotaliveprocess,youcannotchangethe
valuesofmemoryorregisters,andyoucannotchangetheexecutionpaththatyourprogramtakes.Ev
ery
thing
isdeterministic,andthereforepredetermined.
How to Use Reverse Debugging
Ifyouhavegdbversion7.0orhigher(orifyoucandownloadandbuildgdbfromthegdbdevelopers’CVS
sourcetree),youhaveaccesstoonemoredebuggingfeature–reverse-continue.
Asyouknow,inthenormalcourseofdebugging,youcansetsomebreakpoints,runforawhile,stopata
breakpoint,st
epforawhile,runsomemore,andsoforth,allthetimelookingatyourprogram’sdatatotry
andfindabug.Ithasprobablyhappenedtoyouoccasionallythatyoutypecontinueafewtimesinarow,
andsuddenlyrealizethatyourprogramhasgoneto
ofar,andthatyoumissedtheeventyouwerelookingfor.
ButwithReplayDebuggingandgdb7.0,ifyouencounterthissituation,youcantypereverse-continue,and
gdbasksWorkstationtoruntheprogrambackwardsuntilithitsthepreviousbreakpointorwatchpoint.In
mosttypicalde
buggingsc
enarios,thiscanbemucheasierandfasterthanstartingyourentiredebugging
sessionoverfromthebeginningandrepeatingallofyourdebuggingstepsexceptthelastone.
Withbothcontinueandreverse‐continue,youcannowgodirectlyfromanypointintheprogram’sexecution
toanyotherpoint,forw
a
rdorbackward.Youare,ineffect,freedfromthedirectionalityoftime.Youcanseta
breakpointatafunctionorsourceline,evenifithasalreadyexecuted,andgobacktoit.
Example of Why Reverse Debugging Is Useful
Pretendthatyouhaveamemorycorruptionbug.Somehow,afteryourprogramhasbeenrunningforawhile,
apointergetscorruptedandthenexttimethepointerisused,yourprogramcrashes.Butthepointermightbe
changedmanytimesbeforetheactualcorruptionoccurs,andthecodethatcorruptsitisnot“supposedto
”
touchthepointeratall.Suchbugsarenotoriouslyhardtotrackdown.
Withreversedebuggingyoucannowfindthatbuginonepass:
1Recordtheprogramexecution(includingthecrash).
2Starttherecordingundergdbandvmware-gdb-proxy.
3Runituntilthecrash.
4Setawatchpointonthecorruptedpointer
,and
5Reverse‐continue.
Whenthewatchpointtriggers,thatiswherethepointerwascorrupted.Problemsolved(oratleast,located).
Note:gdbversion7.0(andlater)alsosupportsthereverse-stepcommand,butvmware-gdb-proxyand
Workstationdonotsupportthereverse-stepcommandatthistime.
Replay Debugging with Shared Libraries
Acommonproblemoccurswhenrunninggdbononecomputerwhiledebuggingaprogramonadifferent
computer,evenavirtualcomputer.Whentheprogramyouaredebuggingloadsasharedlibrary,gdblooksfor
thesymbolsofthatlibraryonitsownlocalfilesystem,whichgenerallymeansthatitfindstheshar
edlibrarie
s
(andsymbols)forthehostoperatingsystem,ratherthanthoseofthevirtualguestoperatingsystem.Unless
thehostandguestOSareidentical,thiscanleadtoconfusion.
Thewaytoworkaroundthisproblemistomakeacopyofsome(orall)ofyourvirtualmac
h
ineguest
operatingsystem’ssharedsystemlibrariesavailableinthehostcomputer’sfilesystem,andthentellgdbwhere
tofindthem.