From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 10722 invoked by alias); 3 Jun 2005 20:42:35 -0000 Mailing-List: contact gdb-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-owner@sources.redhat.com Received: (qmail 10712 invoked by uid 22791); 3 Jun 2005 20:42:31 -0000 Received: from mx1.redhat.com (HELO mx1.redhat.com) (66.187.233.31) by sourceware.org (qpsmtpd/0.30-dev) with ESMTP; Fri, 03 Jun 2005 20:42:30 +0000 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.11/8.12.11) with ESMTP id j53KgTbE013891 for ; Fri, 3 Jun 2005 16:42:29 -0400 Received: from potter.sfbay.redhat.com (potter.sfbay.redhat.com [172.16.27.15]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id j53KgSO16726 for ; Fri, 3 Jun 2005 16:42:28 -0400 Received: from [172.16.24.50] (bluegiant.sfbay.redhat.com [172.16.24.50]) by potter.sfbay.redhat.com (8.12.8/8.12.8) with ESMTP id j53KgQZF013099; Fri, 3 Jun 2005 16:42:26 -0400 Message-ID: <42A0C0B2.4040601@redhat.com> Date: Fri, 03 Jun 2005 20:42:00 -0000 From: Michael Snyder User-Agent: Mozilla Thunderbird (X11/20050322) MIME-Version: 1.0 To: Michael Snyder CC: gdb@sources.redhat.com Subject: Re: [reverse] A "toy" implementation of reverse execution References: <42A0B5AD.1060401@redhat.com> In-Reply-To: <42A0B5AD.1060401@redhat.com> Content-Type: multipart/mixed; boundary="------------050903000106020200060307" X-Virus-Checked: Checked by ClamAV on sourceware.org X-SW-Source: 2005-06/txt/msg00027.txt.bz2 This is a multi-part message in MIME format. --------------050903000106020200060307 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-length: 2012 And I forgot to attach my example. This contains a trace-frame file for the testsuite/gdb.base/break.c program, with one frame per instruction. Using the rda server and any x86 gdb you can debug this forward and backward, by instruction or by source line. Michael Snyder wrote: > Hey folks, > > Here's a "toy" implementation of a target that can, > to a very limited extent, act as if it's offering > reverse execution to gdb. I hope it will be useful > for trying out ideas. It should be useful for both > the "bookmark" approach and the "reverse-stepi" method. > > What I've done is, starting from the "sample" program in RDA, > I added the ability to understand "tfind" requests, and then > added on a module that could read simplified tracepoint frames > from a file, and then serve them back to gdb. > > Then I generated a trace frame file from the testsuite program > "break.c", starting at main and saving a tracepoint for every > instruction. It only took about 157 frames. ;-) > > Now, if I feed that file to my rda-derived trace frame server, > "tfind next" becomes equivalent to "stepi", and "tfind prev" > becomes equivalent to "reverse-stepi". > > With those as primatives, reverse-step turns out to be, > to first approximation at least, fairly easy: > > define reverse-si > tfind - > end > > define si > tfind > end > > define unstep > reverse-si > set $foo=$trace_line > while $foo==$trace_line > reverse-si > end > si > end > > As several of us speculated, the algorhythm for stepping backward > involves first taking a backstep, then establishing the line range > and stepping out of it, and finally taking one forward step. > > I've created a branch and checked in my modified rda, along with > a hacked-up gdb that I'm using to help create trace frame files. > The branch is "msnyder-tracepoint-checkpoint-branch", and y'all > are welcome to play with it. There's a README-CHECKPOINTS file. > > --------------050903000106020200060307 Content-Type: application/x-tar; name="example.tar.gz" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="example.tar.gz" Content-length: 16275 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 5uP5ZDqZT5rJBKyZKTVppTJJLZlIxeP5lAZbZN9STcWTKtilwELEJ2CbBp9E MoOhRpyVjCcVyA23xCFVIqkkoZPAzltQqfhQqfSCynQIKpUGKjlSCJUkv7pA ZbrRtwiZQ4nMPkNl3IdK9SZQmQlCpUqoJAWLUEmoHDBUqj5UJntBpRyCyqTo FmlCJamNukClz1Y2EEWEzuFCZ5+hUvOhMrObqMwQKknBIlQSKgcMlQkfKi0f Khvd4GZRaREqScEiVBIqBwyVyQYqNdn/WEd2B/7NolJWIEPsBoRKUhsRKgmV A4bKlA+Vmg+VitvwN41KTaBSIVSS2ohQSagcMFSmfahM+WeV3uG7WVSm3Fml SqgkbRehklA5YKjM+FCp+2eVXje4WVTqLirjhErSdhEqCZUDhkpF9rHS6IGV 6TBWGoKVaWIlqY3CWZlu9DVvmUxnkpwxLQwklu5NlvYbK5vv62iKuousVFTB ygxdgpPaiFgZbE+s7E9WNl/Y0VRtF1mpasRKUrCIlcH2xMr+ZKXqY2WqB1am Ql5uVN1HOxl6Ck5qo3BWptJe30paggnEzuFiZ7+xUvOxspdnOykthJXusx3y Qye1Uxes1DxbYqbQsDGz31iZ8LEy3wsrw67B88RKUrC6YKWckNNJPyuImULD wsx+Y6XvpR3Nf79STrYccDfcLSs1rfEcnH62krRNxEpi5aCx0vfWjpbqhZUh 1+BaiuaVpGDRNTgxctCuwX2v7Wjp3ZxXpomVpGB1M69s7YPETKFhYWa/sdL3 3k5O7oGVSaMzK3MysZIUrHBWJg3NbPz4yhYRM4X2OjP7jJVx33s7OaUXVob4 DOUUYiUpWF2wsuEzRMwcTmb2Gyt97+3k1JtgZTKIlSqxkhQsYqVMrBwwVvre 28n18mwnlJUp+vFKUrCIlTKxcsBY6XtvJ5fZTVZmiJWkYBErZWLlgLHS995O zuiBlQkjhJUGveNIClY4KxNNKulb0xJDh4Oh/cZK33s7ufxusjJPrCQFi1i5 XcTK/mal770dY4vPUKLlQPbISkOma3BSsIiV20Ws7G9W+t7bMZReWBlyv9Kg P0xG6qAuWJne1geJmWL/Q8LMfmNlOsgXPYyVWsg1OM0rSR3UBSs1I+n2IWIm 17Axs99YmQnyRQ9jpRzCSppXkjqoC1Y2fC2ImcPJzD5jpSoH+aJ3yUpvGeSL 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 AHhq38hYh7xuOBW7qJewDaFcuDEqOgJvVHvV8BrumOgWbsAqr1dn3KZqphH2 wlBYeLmcjPp65OOzbg6NhnjSKx9UrubUczU+9GqWk+Wn7CzUqVqDhmPYe2Az 45O9agWzTzA4fVlYSUzTjPC1Mx/HeVE+9uCDTImrWmKGPcmzg7FWL5eKT1gw wtb1Uh36LIt/UknO4umKTyfq5WK5iOevYyfa7D/Z2P8t+aoNW2BH0Okt255l R+s1fdW6nzUbmj1Qrq/lLPuhT5SPQgFvcQminOSFfIp/e7kcvdcEq1lf4mlB tqPJozMz7VtD2dIabeLjWwx8fbuttdLGGrq8poL9dvO43MYcRsJR3juhJkd5 5zzaPnG7fcFwUWBWLSuZVPL8jGgkcRRbjybPko8kPphKpY1ZPpG4anGc1hyr CkMpj8MJZh1tj+TWpnGPDO+9bdumWdmnQseXGE+8e/mGjT/ejWuY+caG6Lyi bz7EFK/jtpQn1eyHwvTYg9vyh1OXMuPvam4l3b23OyxKJryaa/WSU8yWimUr W8xnjUpZzAe8auuzHJg5sTD8DdAhJaSCFMaMe9J2g9uaRW/fz9Utx5LhiT3X XDVm/LWXsUV4kXwblZNd1ZfPIG62ym0Sd1Frd9Kit6m11k2tn3S36MePQ+74 ZRw/3uwUzUZ5aofX5e+UfNf/b9s++F2gVCLg+j+uqEpSUuS4lkrF46qq4vW/ qqXo+v+d0C/Nnz8TiUQa4RFpVMLQuetjkxpueJfYrklMmpCmpbthuY+H4fM0 2MDnNVjHzzh8xuAzCp/bIZPbvzA2iZ/bIHybGxdxP1yQFj8FyBA/mF6aEvF8 29chDj6TsGEKPvvc+BFYfA4Cn4M4/Pw+hPGzz90HfqbBfhr2jR8GYeaL++if O2a7tvDSn4BJ94mSeRw4U78Wq1VicbF9yi07XIe6bSU+426db4HPpLu+ryVv r84j7j4wzUSbMsTc5QfgcwQ+SfhUvzE2iWkOS++WPurG/6kbf8INJ93wg254 2g2fgo/8t730B5tt77bJu1rCUvYj69kla7UIJ337NE6orZqUza6uVcpZHClO NitB8xjYLEnJnbRJYs4m4QxLyi5cyuLVTDkLE1IT0qK5mxanutLZ8wunTmfj MVm0h/cv4rZTRLrHbWvUVLF4K1p59yYfgbbYNynaZBwacwWWE5D0Y7iEhv8E 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 Yra3fkBauO0EGByMwZYPH/CMDkeORB4Gw0PjjXQjEJyKRcDmoNjwAMxVD+NF 3xE37cGtaW/TGmk/fACN27ZBTNq+V39rtC/X+NZy7fNbeTYTXttJv8KnGx/H EkT+38EofPO7PJET9Zp9wn3CKPkDJ3JFp+beEBSuQO4zSZynwzW8t+psVK0a rPJT6PgIkmX0j2Ae8C/+3uSjXx05dvjR70+ee/NN8/H7zcl/cL9qTrKv2o/f P/mB//noCFzjR9K8WHdtK5bUGCaSyBc7++iHIhkb/s1meFqcu+P1Q0SKfG7y wNjYlyLiPoc363sRlnMHJ58ZOXXreDU29YnY2EJs8mJs6lxM+kgMEr/HtUVe zfhswYRfM0guio774rztiJL7fNvblQVtv+yO02hLHl92h2a77TgWx9tsv9Cy fcv8pzk3xZPLmYXz85IUq22swZkRlo4tlgVvDZJYdlWKlSuOFZs7tXDc0Vel WEGvFaSYuVGGhGIJ047Yarkec/1StgSyEGdbJbQTK9WSgzkX4dvBM1osDwGI qpi6o0sxq5DN2/qaJcWwqDXYgVh82rD5zvS1ogE7qDj8S+QmUuZqYOb6SsA2 /hxTt/XyqlXzgtV6DjJohovlfKVhmoPetO6F8BThrbvlEQGsbLe6UxLXq9jr +X3NiLiO9ORdcNwtift6aMfvP0bc+2quxtylIol7gGiH17rnwC7ti/fuVaYk cb2LdngN/DTYPe+mjUjN+5IflsR1MNrhNfPUiLhWbi3fWdFvK2iH17qfHxH3 Cb39evc0VyRxfYzreI38/Iioh3+/KByvt7hp8Br7hRFRHn898AK45LPDa/IX R5r3ZPf77Opu/njNj/cEXhsRU/LW9qv67N4Cu7fAbrHFDj9P+uzwnvY5aKTf H9me3xd8dngPYgpW3ttmv39HavaDWbCb3SfuvbbafdVnZ4Kdua8Z57f7ddcO jx2/371PtEOr3W/47KpgVw2w+y2fHd77uxaw32+5dUU7fh99n7iHPu6zw/y/ 7csP770+MrE9P/z8G58d3os5NyGuvFvtXvbZmWBnToj7P63le1Vq3kvHm5DV ifb1/QPJ9zwBbcFuybfBW/3jFrvvQWYPS9vt/qLFbgQ67T9tY/eTFrtvgd2/ 3LfdbiSy1e5xGByfa1O+qRa7P4HZ9h+22e9dLXbfOrK1IF67zLTa3baVQ14c 3hsb9W3/D2CntSmf15c9XYPB8TR0lqOSeBbkceiWlvzeer8k/WdfQn+ZWoVc lXh6YTXdCIsMzjXCYg9PN8Ki1lNf9MKiF3++ERYH5vlGWDx5eaERFj3rxUb4 Fh5+rREWD3PfaoT3i/Jc98KiByM3RPhWHp5thA/ysNkIH+Lhwte9sHjaUW2E D/PwtUb4CA9/rhEWZ55HvuGFxSzlXCMs7oyajfAdIv9G2E9UDL+nJfwLLeH3 toTvbAnf1RL+Wy3h97WE398SZi3hD7SEj/IeUXLbewTa+7Avfkz6y00sgdee EWjPY1KzPSNgjefWa43wEWke8/uGF75DWoAlf6DCw++W8Anf87794X3sVzrs /yrm59v/L0vu/V53/1+Tmsc/Asf/H7aU55/B8o1nmvm/1JL/qy3hH0rN/nAY +sN/lUR/857z/Q+pOWc9Avl5N92954pHIs32mhr5y827Mey2x+GROyQZwvgc 65SbHu9ZevNmDH8k0hwfR2B8LEaa81iMx5sR/ueWn440xwvGfybSnN9ieKOl PF+GMD5CW3Lj/36kOX/G8D+ONPvzFLTHC5HmNQDGfzvSnIdj+N+54PGem/6X lv29HmmOFwb94SeuvfdcFR8ueOP7CIzvgyNb0x91Gec9d42PbC1fZqQ5Pg/D +LwE4Wu++JWW/FZHtj63XR9plm8Kynfdx1QGn2+0pP/nI81rGaz/77XYS+gg 63usKxm2U3Pq+TxcgWWzp1cuLWXPLyyvZLMQemRL6COnG4FqTJZgll4tWY5l xhSINCvZ1VIlp5eyfK6f1evXJD7nzpr1tbUNL+v5i480c/YCZ5bmLsw3Qrgb b72Zq9HI1btObVw3Zh+5cnHuwsJpKZuvZgtXO9+Qdx9cP/xw82F0NotXL1nu Y8xvdcJ+a5VsQS+bJct7jG3U6tzMf/nFL4C8OyviFtKWfEX7endOtuxGRPny 9uUVh+1wHdRIXiw3Hhhse6a+tR6Yia8eeEnl5tKm1rw22WzVtlqS4cP8LZYW vzbLnj1/6dTc+eylM2eW51eyK3Onzs/DMRIN5svCrVqrM4CvMO09DbYWxK18 4P3DFs8EUq8S/l+xVTOHrf75t2UfIe9/yakE9/9KyLKa1Lj/V0JJ0Ptf74hy /N2FKH9gL1Z1/ioFepEblVLJMhx2j22tzrJ7+OP8KAz0aBRdJ00rr8O4PM6T ChfKSpnHNLccX7OcQsVkWjQK5jB+GR+p9Sr6StbxfQ2nUmMfxIcO7D6mJEXu nqlpV9AQF0yBldqW6HJrdHlr6uK25MWt6bcZlFsMrkW5Hz27J1+pPHgPrxWH UMOPlEe0xECVILWJXrH8u1wp1vBNMr6Vubb8lLhlZ4C99YbV8R3smCdus2u+ tzbHn49/2Lll1yzEwNvQx0LHf1wW419R5UQK3/9MaAmZxv87obuZLvz78Z0X txsc5xvw9iturNfwHRneh2L4ktnlmiVeVKtAt81tMJwgxWKx5gC3qsW2na81 bbHMSpVK1f+6TWPsbk3obvYXb9suoN+3tS0GGGAmNzfMeJY9De562d3bjob3 lip1P8JJJBKJRCKRSCQSiUQikUgkEok0jPr/5mxumQCYAwA= --------------050903000106020200060307--