From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 32600 invoked by alias); 13 Jun 2011 15:58:13 -0000 Received: (qmail 32591 invoked by uid 22791); 13 Jun 2011 15:58:12 -0000 X-SWARE-Spam-Status: No, hits=-0.6 required=5.0 tests=AWL,BAYES_50,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,RCVD_IN_DNSWL_NONE,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from elasmtp-galgo.atl.sa.earthlink.net (HELO elasmtp-galgo.atl.sa.earthlink.net) (209.86.89.61) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 13 Jun 2011 15:57:57 +0000 Received: from [70.170.59.51] (helo=macbook-2.local) by elasmtp-galgo.atl.sa.earthlink.net with esmtpa (Exim 4.67) (envelope-from ) id 1QW9WW-0001I4-OW for gdb-patches@sourceware.org; Mon, 13 Jun 2011 11:57:57 -0400 Message-ID: <4DF6337F.1040203@earthlink.net> Date: Mon, 13 Jun 2011 15:58:00 -0000 From: Stan Shebs User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2.17) Gecko/20110414 Thunderbird/3.1.10 MIME-Version: 1.0 To: gdb-patches@sourceware.org Subject: [PATCH 0/2] Global breakpoints, introduction Content-Type: multipart/mixed; boundary="------------030202000008020607080908" X-ELNK-Trace: ae6f8838ff913eba0cc1426638a40ef67e972de0d01da940cbc7357cdcc473f73e0ea809e4bd1544350badd9bab72f9c350badd9bab72f9c350badd9bab72f9c X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2011-06/txt/msg00163.txt.bz2 This is a multi-part message in MIME format. --------------030202000008020607080908 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-length: 2351 This pair of patches plus Linux kernel module adds global breakpoints to GDB. Global breakpoints are installed in multiple processes of a target, *including* processes not under GDB control, and processes not yet created. Conceptually, it's similar to breakpoints in some RTOSes where tasks share all or part of an address space, and so a breakpoint in the shared space will hit in whatever task reaches it first. In Linux, this is a little more complicated. We don't want to force every process to run under the debugger all the time, and we need to catch new processes somehow. The implementation here uses a kernel module that communicates with debuggers via a device /dev/breakpoint. In the absence of appropriate internal support in Linux, the module uses kprobes to hook into several key spots, and then installs and manages breakpoint traps on behalf of the debugger. When one of these traps is hit, the device removes the trap and notifies GDB, which then attaches to the process and installs its own breakpoint trap in the usual way. The user interface adds a "process" keyword to breakpoints, along the lines of "thread", so for instance "break mysubr process *" installs a breakpoint in all processes using the file in which mysubr is defined (which could be either the exec file or a shared library). "break mysubr process future" installs only in processes created after the breakpoint is defined. In addition, combinations and process user/owner qualifications are possible, so you can do instant system catatonia with something ill-advised like "break malloc process all/root". :-) The patch here includes both native Linux and remote protocol for Linux gdbserver, and I've attached a tgz of the (small) kernel module sources to this message. (The module has only been tested much on the 2.6.35 kernel.) This is kind of a freaky addition - it's very cool to see in action, as you can catch the first process to call some library function, and it will be even more interesting for multicore situations where lots of copies of a exec may be running. At the same time, it pushes the envelope on hooking into the system, and in the absence of full multi-process infrastructure, the user interface is a little hacky. So I'm open to ideas on how to do all this better. Stan stan@codesourcery.com --------------030202000008020607080908 Content-Type: application/x-gzip; name="bpmodule.tgz" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="bpmodule.tgz" Content-length: 15067 H4sIAA4s9k0AA9Rca1fbSJOer/ArOplDsIkBk8xlNwTmJYFkOGGABbLZ7EyO jyy1bb3otpIM8c5kf/s+VdUttWwZmNuHl3MCtrq7uu5VXV3KMNfedZaGSbnl f/U3/fTx890339Dfne+/7bt/8an//Nmz77/a2fn2+bf9nW++73/7VX/nWf+7 Z1+p/t+FkPszLUovV+or/Enumnff+L/oz/bGqtpQ6p3OEx2pOA2mkVZhnEU6 1kkZJmM1jtKhF6mOn6dFsZnlqa+LoquGleIUgMBAXqfZLA/HkxKTu+oZRItH gb5Mp7mv8xnP+ZCHZakTNZypS3BUXU70sFAvibv/8DG5MJO3/DTet4CvJmGh sPM492KFj6Nca1Wko/LWy/WumqVT5QNWroOwKPNwOC1BQ6m8JNhOcyIqHMnu eDhNAp2rcqJVqfO4UOmIv7w9fa/e6kTnIPV8OoxCX52Evk4KrTzsTU+KiQ6A NwOiJW8Ii0uDhXqTArJXhmmyq3SI8Vzd6LzAd/XMbmIg9lSaM5SOVxLyuUoz WtgFxjMVeWW9dmsZC2pKAxUmDH2SZiBqApgg8zaMIjXUalro0TTqMQzMVh+O r348e3+lDk4/qg8HFxcHp1cfdzG7nKQY1TdaYJEGhAAN0nIvKWeggEH8dHTx +kesOXh1fHJ89RGEqDfHV6dHl5fqzdmFOlDnBxdXx6/fnxxcqPP3F+dnl0db Sl1qQkwzhDsYPWJhgZeBLr0wKiriP0LABRCMAjXxbjQE7evwBuh5yofO3S9D huJFKdSZSMXsmpu7KhypJC176ha6CUTTReny+lrCPXWc+Fs99e2/qytNtqLO I8+HXC+nBOH5835PvUqLkmb+dKBU/9nOzs7mzvP+9+r95QGAba+ubm+ITOdN rgBRYERMRD02tufY2uMemc7tJPQnUAPCK9YQkDsF+lDoXBQDxMTTqAwJR2O6 GjovQi5mRalj1o0w8aNpQOaeJpgAdjiG4qdJmacRYeRBNsPpeKxziPUYapbm 14UxioJomJndCVSZexl9LfOpT2wDaSVk9z9TXRB2Uep78lgUmGA4OI4IfZ1j bo9GE/nq64xhXx6/vbo4OC/IyAnBG9mTYGByLKSDjHAU2l3YNGoCrEZ5Zen5 E6trV6kKUtYP3tWKJ/YAEP9IOvAEJaHnspxhk24SjKEGtoEehQk7DPXYhy2J 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 sU6p/DAbpJlpjpm/merNXWJlrX1+bUy1UBmtwJyBKVJBFzprRddGXbenr1d/ I6aK5Kv+Qbe7tGubbaqOwv79x0yLUpImm1V70nWYZeCY2z66XXVuITRxc4ai t7B/sHGo9eLyg+YOqvqwb6RkXjziyBbSC4qZSNJ9B09ejZa3JFmh6ZVRqp1Z fea2bn4LLHDe+XMPZGoSlnLbWVDf14DFygh1Fq4hTYfZgBsSpJuGQjIvo9fq iC8RUhN828iytFiUOSzBTM912dpDNgpzbiL7GkLaWa4ijGGLivQEj7364Dun JzQKgX1NrwOOGmridqb+UTVhtO5TE9t5SqhUlQait2825eaf+Z4t7pfuNgqn m0cXR5dXBxdXlx8vXZJM2Hi0tEvM0mI3pZ9pVm3iwjJ6fTxCbraeayaOu+ZY FbnzyPYSp3SXPnbTLiKGFIfuf22KdDY4PTt9dXL2+l19sd9vpCfcmEYvz5dN Jsy3okv3i7qjG65bb9HkVYPye1neDsPwqDJs1ty7ewMfpNWw31moo0B6Ih9z JGHYpl2xIR7pxXK7k1SHo4u7ovombY1OmS3XZaVRfFnvTHOcaHujoZldvT12 zf+TRIcfdx9IrHC2sDkH4VOTZ4W0RDWNVNiTmFqWKUpX/k/ZNzXMYcL41uGs auC2d+G185P/uKDV+6UJN9r9OR+4nCOy85/wan+1OxOE/pA/U6rZv7bYmy9l NdMgt0DB/LyfeQZduaz/0l+3r8fMF/XcbvY7aQrSBAIdI+mi7MtpPJ7ft3Ej Y0gEee4bbqQ09Ppnq87QwED6XDfIdbXFxMbrcuZU3r+LBt6tRU/atONvUAve /oFaEZtLA6MUzA7igwQGHFXmnTq/3lS7qHtiGHPrtz11fnZycnyqfuMPF4en Zxc/VS+ZeYV5T8WLbr1ZQa/aFezh6X84IG2wIcsFRv+ti0D7cFFBa9D0pX6n dwLli/hClg6qKb85+P/tXWlv28gZzlfxV3C1SVYyJFmSY7uw6nQT2901aidB nDRoi61ASbStWhJVUUocLPLf+15z8dAVJ0AXHOwmEckZDud8j+d9RgwbmSvO C9ZpPwqPD2IvkTEltLy2xn2MIvlQkUjYRjGb1INkwAVhOciYRYHnM+VfssQ9 KHM4QyYMBk9ShOttMFAQOPQjGwv/rpLzBR+6qajfM3D+ybLxrIp/OJn/YYQ5 rtWaI71pr31ZcUjG0X1COidyBGG0pWPojOOoPwxQBzPcOm4gGVl7e2zt7SF+ WuycaO3tpfAd4mNkng54WQh6NGJHDE2FghGgSqxIZgiykgqbmbD3fbKW931C clPK9Wj5u5f41ie/Ge19tTGq50BFEvrV6WI85XmCSizRM6i5KSwisAzY9A+7 vouPwylAnAC0UvVAFhFXEcGw+d87ggfkjV/Br2mVJ5FAuxbgyk4YXauAhEEw D6pewv/EgQTpGYTYjs+ZShPsU+yenyKQUBsbpjW//EvKtcxfyQMYsuCgEN9S ftidFTu5Ztid7W1PVepEeSePjITD9nUNvvS1XJ/emS03pmOZRksdf04L/sXz BFpmqUzuU9v58hz+pWJ1SlnN6Rt5gZ9VIjnX+IsSrKEa3ALpIl7pML/cPlhv di8Px0tjctNVMcio0b2/6z9RfyovxxPdzrw3otdDRyzTL91b1nw26I2exm64 4GSVyYniq2VFKpqLFu7MsUiq+1agdDVrzKFeafi8CDrHxs5q2bzELqST22z2 4q/Hm1lyacWZ5oSiW8tp5kzLCXAVH2pOjz91nThJ52jWMMa5R5u/8mvhuku9 WbKnXvYaLXMt3Qk54CftSt1uGynlfATZhVftItphqizOWWMDtnjlWlzW5a7j dc3Jnqad0/MetwI9emTjmvp12QG+6C3IErC6GvoZ+yCjXEdTUMVpA/EbZKSE dOz7YrKs0XXStPV1/MXXWRVS1zlWi26QgK9v4C9VEEtEqiD6VSMGD7emhkQI H8RfHNPBa1djDKsCuusvz69Ouqf/ePXi8vyke3kOcja/ZxKM8SVl02ZlvsGf 6z+VL68pKhqb/G+B0MgYqceg1YWxx6Whwr2fAxR/irVoYBHmKWkbBTSEI0oE b28xHA1A6oznIEtxfgeMRcIaFYOQUKhQKDQYIyStmiC/x0eSNiQ4UlgphVuL kdYihsMGNAv62l47u1kwm+GQSLFMyKSxGqM7mCKLb9CCP4trQt7HPEMT0HSC zxaIlFi7iIUI5I7JTUhsgtKAGD2Novx8OJZoKcXeIJRUd9ClGN/FVGRCOGFd 6YJS3mWdaKZVBsm7czfVCsN0jhliJLS5iQ3nAzqOxlMdxcPyPcylGATvSTgr V62A8yzR3aqJb9eEtYuao1kIJdngGH6Px8ew9xmv/hJtw/qZAWeX/G5AWdVk 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 4CoNWWV2ZPxvZmcy6S0e/IdHhc2x/4ZjhWrX+eVsKX4vnvqyQHWGgwdFNoRR NegHMxADdS67jz7hYTh4wtxiqvqLpgnUmeVpFMGx23RueMLyp1hz4bnim5BF oLSMSqWUHRX8I4t9tshHNsB1ArjVAqMpLWCt8RyBRwk4Dg2eCDVapEDxkIQf thS+R+YcteGhS5aXceY+ZKlJ2i3PM4R1Qei1HMPHTD6DxcxdnPIMjc77XEGD r32lGWe1BUdpWM4+F/T/uxgm9GTcpVgZTzJDrrebrtg5pclXwn3kOSYD/LZb J4HvVfcHwnqRs9Zvu+59NwjpUIj+jKuVyPpmYR0N+ZmHt+pzgZkSdMIHMaIL QdMQ2q7Xrfj9Susv5EjwVyoZ2p3lXHxmKXcIcUqyhrje4ZQ+oOMGelNhvXOP uglns7RZ804zqeXEo1BJPKo1ghT9PcJ9spBDn3FAYYgKyD1pNUzxgGI73/f7 VAbUBn4SSFPBB/3KUwu3KbE1xI/TNaEQZP/2K2UJm7DBmn7z2bNnNTp3o+bb wRN8Tdf9CkQ72FwIkClITRXBhMBLbXS4UyT9ctRjF0WvxbRLQNGKDXko62if O/ZY5CmVtv+dyH5wY7kTC4J11MaqvCg5kY9FesQFRzbsFek4DyTZychn6wDH ubDAjJzSVBVu0G40RQ6CLq2nZoipju7KZlB56pYi37K82bXPb+1GN17CTZvc 5MxocH0z0dyZeIZOKo/b1Nm+/lSu7ZtZl7FWI7vGj7VbOmEz2bS5E9kz2tx9 ItHw+c6kTmbu7RvTLWitFnWU7bUb1FXRN21PN3dGczoPJFoz13bUyczrDud8 i01m7u17wilnk45gmWzTjhBJbsuOkNz5HcEPZHdEWrbuZOX96qbkcpwIdEfC IGpL2KfDe1fEyJEf6LG0/KAUIDyBfTzlw73JNrGgQ1N0OChLqsxjTsLLWlVf 9aAeLrkPpmZ47pP2wpr7UGqTE52epJRlIo0RXEQuyhWWoIc4lEKEP5Hd4I5c 5g6TLsEyL1+fvr84616cn5y9ujqrlH95c4EdJJdfvH/36+u3lfIJjB8+dWv2 2bp9enZ18vb8zbvz168q5ZeWV+4GPgefe1Sk75NOKJbmIrpp9OPRN3pHE9LB s2f4d+twv2n/jal1cLD/qNXa39tvHewdNluPmq12q3XwyG9+o/o4aYGYE99/ hEdNL3tu1f3/09Rutlr15l69eej7V/CJ/tVt2It9/8/4vT/j8h/L9G30o/Fz UKdtbFej76dO2z3yX4WfxGrQ8EoVZsFJXnUsYHD3Q3AXquWbApTDAUWLh7MY H5cgQHgQifAUmxPTkMEOPZVnMO5PXnW9mJBLTO5g7J3kRvYwD767WYdPb+9t +93JL2CGPt7I6Atd/u2MaqX0eXjmPcGla8yGgdQNVvQvqsqCCyFDUJxZCDF3 Qkmn7CC/748WgzCdL2UXlpcnqo2P5stj+FFZBmOrNl7JwMnldDSrzLRcAkUu tdMEM7IZYLHu8b5Wp7aa23WqdBEedYS3RlEwqNP9RnybuHcJ4xV/JC6/PXtx enlmX/T+feFdRCDD+H8PZkOK4D/CTRVychxjfRTdeOafdWFxrKPEeeSXnQW6 7J1NBkcPuTs63/iA5doJF/nD/f289b/5bH8P1v9nBwd7cLnVpvW/3S7W/++R fvxhtzec7Ma3SgA8tkOYPY6Idq95P2pp25uNIZf/WMJwn/u7GJszWYxGfvv5 0xbc9uvXfPHx71zWlx0sYDj5GN1hlGCM+clvRDZnHTaMNjVaMoI4Dgfeboy1 lMehyMauvLNxF/nlxz+XEbVOMmoLi3+PwUcBu3pI9q2r0G4MiI5tmiPEpzbw uHksuXl4eMjVtfj/PSq3+ceUSdU69i3fsUL+a+4dqPm/v3+4twfzv9XeaxXz /3skPhy7e/X2xP/Lsb87GvZ2eWLFu49BzUbq8wXZPuqz6i7NHs978+HUPzr2 1f3pJ1Divaj3n/qYzlc1G2rkeTCrj7zS48rli7+dVf36CeQyr6z6V+9fnp6/ vTp+XIFCqxLOH8N0xAUGMvICUp/5O40I/r/DP3Ci0p8ghTV2kPTOv+S1IP48 RoYCVUwjmiGMtzEfT7uKucDz/pjzeNvEAsu3fccq/e+wLfP/oNmG/2H+oy+m mP/fIxFkiQAzF8PJ4l4RfRhiEop3Irp2QialQQE1jwEaQeIADBsuY50Ap1nD 4ZWCv5n9FHsKZO957xRtCapBBNooj2GTKvMt5Z3GmwPY+uMF/OkIsfIgg4Il IoryMJn0p2h2Fw44cx9u2jxqsbXtx+WOB9u+hlpMIzoekLFT8KkBhccqzBgJ Gw7CHJQs7+X7X66gMoa3Dc9BROUGI36J4RVrI83Rbhw09vYZ3HwbwCIGSsAQ mh1kMMI9T/rDELOrLlIsMHGH8PXogBxbEG46lI7VHaL09hRrivtW1LcZM+1S vDSo3vKdpIzuteu94Zyqd/+nA9+ulfuwCuYCPfA2mA0+DfH89tFwPJwzCVAN YeS3SNgeTeyTNKJrz+EVxBbVJUk7N0Cxw+AzwWhYpUpPeTrIoBcio9U4mJCD XCHTpCNAJkTns4pK7mn0yqfbCJo8/hzPwzGFJsO3XRKKWEwOCNuFpuV5AXrr R+J6kDgRZp6PmeOmHzEzMwJIgnkgWJjFjNrrbVg3+CSb2o+ZsBkvBRMHa2kx cXI/34QTpAoaffb6syDm0DuucqPY34pUpCIVqUhFKlKRilSkIhWpSEUqUpGK VKQiFalIRSpSkYpUpCIVqUhFKlKRilSkIhWpSEUqUpH+2Ol/eCkS9ADIAAA= --------------030202000008020607080908--