{"id":1007,"date":"2019-04-08T14:09:53","date_gmt":"2019-04-08T06:09:53","guid":{"rendered":"https:\/\/comzyh.com\/blog\/?p=1007"},"modified":"2021-11-17T00:23:52","modified_gmt":"2021-11-16T16:23:52","slug":"gdb-%e8%b0%83%e8%af%95%e6%9e%81%e7%ae%80%e5%85%a5%e9%97%a8","status":"publish","type":"post","link":"https:\/\/comzyh.com\/blog\/archives\/1007\/","title":{"rendered":"GDB \u8c03\u8bd5\u6781\u7b80\u5165\u95e8"},"content":{"rendered":"\n<p>GDB \u662f GNU \u63d0\u4f9b\u7684\u6d41\u884cDebug \u5de5\u5177\uff0cGDB \u53ef\u4ee5\u5bf9\u4efb\u4f55\u53ef\u6267\u884c\u6587\u4ef6\u8fdb\u884cDebug<\/p>\n\n\n\n<!--more-->\n\n\n\n<h1 class=\"wp-block-heading\">\u4f7f\u7528GDB \u542f\u52a8\u7a0b\u5e8f<\/h1>\n\n\n\n<p>\u6700\u7b80\u5355\u7684\u65b9\u6cd5<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>gdb .\/a.out<\/p><\/blockquote>\n\n\n\n<p>\u5982\u4f55\u9700\u8981\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\uff0c\u5219\u9700\u8981\u4f7f\u7528 <code>--args<\/code> \u53c2\u6570(\u4e0b\u9762 someargs \u548c arg1 \u7b49\u90fd\u53ea\u662f\u4f8b\u5b50\uff09<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>gdb &#8211;args .\/a.out someargs &#8211;arg1 value1 &#8211;args2 value2<\/p><\/blockquote>\n\n\n\n<p>\u8fdb\u5165GDB\u540e\u4f7f\u7528 <code>r<\/code> \u5f00\u59cb\u6267\u884c\u7a0b\u5e8f<br>\u5f53\u7a0b\u5e8f\u8fd0\u884c\u9047\u5230\u5173\u952e\u9519\u8bef\u65f6\uff0cGDB\u4f1a\u6355\u83b7\u9519\u8bef\u5e76\u5f00\u59cb\u8c03\u8bd5<\/p>\n\n\n\n<p>\u5f53\u7136\uff0c\u6700\u91cd\u8981\u7684\u4e00\u70b9\uff0cgdb \u4f7f\u7528 <code>quit<\/code> \u547d\u4ee4\u6216\u8005 Ctrl + D \u9000\u51fa<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">\u4f7f\u7528 Core Dump \u8c03\u8bd5\u7a0b\u5e8f<\/h1>\n\n\n\n<p>Linux \u652f\u6301\u5728\u7a0b\u5e8f\u5f02\u5e38\u9000\u51fa\u65f6\u4f7f\u7528 <code>CoreDump<\/code> \u5c06\u73b0\u573a\u5185\u5b58\u4fdd\u5b58\u5728\u78c1\u76d8\u4e0a\uff08\u6587\u4ef6\u540d\u9ed8\u8ba4\u4e3a<code>core<\/code>). GDB \u53ef\u4ee5\u5229\u7528CoreDump\u6587\u4ef6\u6062\u590d\u73b0\u573a\u8c03\u8bd5\u3002<\/p>\n\n\n\n<p>\u5982\u679c\u60f3\u4f7f\u7528CoreDump\uff0c\u9996\u5148\u8981\u7528<code>ulimt<\/code> \u6253\u5f00 CoreDump \u529f\u80fd<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>ulimit -c unlimited<\/p><\/blockquote>\n\n\n\n<p>\u8fd9\u6837\u7a0b\u5e8f\u5f02\u5e38\u9000\u51fa\u65f6\u624d\u4f1a\u4fdd\u5b58 <code>core<\/code> \u6587\u4ef6\u3002\u8c03\u8bd5\u65f6\u4f7f\u7528<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>gdb .\/a.out core<\/p><\/blockquote>\n\n\n\n<p>\u6765\u542f\u52a8\u8c03\u8bd5<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">\u7f16\u8bd1\uff0c\u52a0\u5165\u7b26\u53f7\u4fe1\u606f<\/h1>\n\n\n\n<p>gdb \u5982\u679c\u4e0d\u80fd\u5728\u53ef\u6267\u884c\u6587\u4ef6\u4e2d\u627e\u5230\u7b26\u53f7(symbol)\u4fe1\u606f\uff0c\u8c03\u8bd5\u65f6\u529f\u80fd\u4f1a\u53d7\u5230\u6781\u5927\u9650\u5236\uff0c\u4e0d\u80fd\u65b9\u4fbf\u7684\u4f7f\u7528<strong>\u65ad\u70b9<\/strong>\uff0c \u4e0d\u80fd\u67e5\u770b\u4ee3\u7801\uff0c\u4e0d\u80fd\u5b9a\u4f4d\u5230<strong>\u5d29\u6e83\u7684\u5177\u4f53\u6587\u4ef6\u548c\u884c\u6570<\/strong>\u3002\u5982\u679c\u60f3\u8981\u4f7f\u7528 GDB \u8c03\u8bd5\uff0c\u4e00\u822c\u9700\u8981\u5728\u7f16\u8bd1\u65f6\u52a0\u4e0a <code>-g<\/code> \u53c2\u6570\uff0c\u52a0\u5165\u7b26\u53f7\u4fe1\u606f\u3002<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>gdb a.cpp -g<\/p><\/blockquote>\n\n\n\n<p>\u5982\u679c\u8c03\u8bd5\u65f6\u53d1\u73b0\u6709\u4e9b\u53d8\u91cf\u4e0d\u80fd\u8f93\u51fa\uff0c\u53ef\u80fd\u662f \u7f16\u8bd1\u4f18\u5316\u7ea7\u522b\u592a\u9ad8\u5bfc\u81f4\u3002\u4ec5\u5728\u6709\u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\uff0c\u53ef\u4ee5\u52a0\u5165<code>-O0<\/code> \uff08\u6ce8\u610f\u662f\u5927\u5199\u82f1\u6587\u5b57\u6bcd<code>O<\/code> \u548c\u963f\u62c9\u4f2f\u6570\u5b57<code>0<\/code>)\u9009\u9879<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>g++ a.cpp -g -O0<\/p><\/blockquote>\n\n\n\n<h1 class=\"wp-block-heading\">\u5e38\u7528\u6307\u4ee4<\/h1>\n\n\n\n<p>\u5f53\u89e6\u53d1\u65ad\u70b9\uff0c\u6216\u8005\u5f02\u5e38\u4e2d\u65ad\u65f6\uff0cGDB\u4f1a\u5207\u6362\u5230\u76f8\u5e94\u7684<strong>\u6808\u5e27<\/strong> (frame) \u7b49\u5f85\u7528\u6237\u8c03\u8bd5<\/p>\n\n\n\n<p>\u5e38\u7528\u7684\u8c03\u8bd5\u6307\u4ee4\u6709<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>bt (backtrace) \u6253\u5370\u5f53\u524d\u7684\u8c03\u7528\u6808<\/li><li>p (print) \u6253\u5370\u53d8\u91cf\u5185\u5bb9<\/li><li>f (frame) \u5207\u6362\u6808\u5e27<\/li><li>l (list) \u6253\u5370\u5f53\u524d\u4ee3\u7801<\/li><li>r (run) \u4ece\u5934\u5f00\u59cb\u6267\u884c<\/li><li>c (continue) \u7ee7\u7eed\u6267\u884c<\/li><li>b (breakpoint) \u63d2\u5165\u65ad\u70b9<\/li><li>d (delete) \u5220\u9664\u65ad\u70b9<\/li><\/ul>\n\n\n\n<p>\u7528\u6cd5\u5728\u4e0b\u9762\u4ecb\u7ecd<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">\u6f14\u793a<\/h1>\n\n\n\n<p>\u4e0b\u9762\u7ed9\u4e00\u4e2a\u542b\u6709\u9519\u8bef\u6837\u4f8b\u4ee3\u7801\uff0c\u6f14\u793a GDB \u5e38\u7528\u7684\u8c03\u8bd5\u547d\u4ee4<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int divide(int x, int y) {\nreturn x \/ y;\n}\nint main() {\nfor (int i = 10; i &gt;= 0; i--) {\nint j = divide(10, i - 1);\n}\n}\n<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>g++ debug.cpp -g -O0<br>gdb .\/a.out<\/p><\/blockquote>\n\n\n\n<p>\u663e\u7136\u8fd9\u6bb5\u4ee3\u7801\u4f1a\u4ea7\u751f\u96640\u9519\u8bef, \u5148\u6267\u884c(\u8f93\u5165<code>r<\/code>)gdb \u8f93\u51fa\u5982\u4e0b<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(gdb) r\nStarting program: \/home\/comzyh\/Projects\/tmp\/a.out\n\nProgram received signal SIGFPE, Arithmetic exception.\n0x0000555555554608 in divide (x=10, y=0) at debug.cpp:2\n2    return x \/ y;\n(gdb)\n<\/code><\/pre>\n\n\n\n<p>\u6211\u4eec\u80fd\u770b\u5230\u5f88\u591a\u4fe1\u606f, \u6bd4\u5982\u9519\u8bef\u51fa\u73b0\u5728 debug.cpp \u6587\u4ef6\u7684\u7b2c3\u884c\uff0c\u8fd9\u884c\u7684\u4ee3\u7801\u662f <code>return x \/ y;<\/code>, \u51fa\u73b0\u7684\u9519\u8bef\u662f\u7b97\u6570\u9519\u8bef(Arithmetic exception)<\/p>\n\n\n\n<p>\u73b0\u5728\u53ef\u4ee5\u4f7f\u7528\u00d7\u00d7\u6253\u5370\u53d8\u91cf\u00d7\u00d7(<code>p<\/code> \u547d\u4ee4)\u529f\u80fd\uff0c\u770b\u770b x \u548c y \u5230\u5e95\u662f\u4ec0\u4e48<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(gdb) p x\n$1 = 10\n(gdb) p y\n$2 = 0\n<\/code><\/pre>\n\n\n\n<p>\u6211\u4eec\u77e5\u9053\u4e86\uff0c\u9519\u8bef\u662f\u56e0\u4e3a y = 0\uff0c\u51fa\u73b0\u4e86\u9664 0 \u9519\u8bef<\/p>\n\n\n\n<p>\u90a3\u4e48\u4e3a\u4ec0\u4e48\u4f1a\u6267\u884c\u8fd9\u6bb5\u4ee3\u7801\u5462\uff1f\u53ef\u4ee5\u4f7f\u7528 <strong><code>list<\/code><\/strong> \u547d\u4ee4<strong>\u67e5\u770b\u9644\u8fd1\u7684\u4ee3\u7801<\/strong>. \u9700\u8981\u6307\u51fa\u7684\u662f\uff0clist \u9ed8\u8ba4\u5411\u4e0b\u6d4f\u89c8\u4ee3\u7801\uff0c\u4f60\u53ef\u4ee5\u4f7f\u7528<code>l -<\/code> \u5411\u4e0a\u6d4f\u89c8\u4ee3\u7801<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(gdb) l\n1   int divide(int x, int y) {\n2       return x \/ y;\n3   }\n4   int main() {\n5       for (int i = 10; i &gt;= 0; i--) {\n6           int j = divide(10, i - 1);\n7       }\n8   }\n<\/code><\/pre>\n\n\n\n<p>\u5230\u8fd9\u91cc\u6211\u4eec\u77e5\u9053\u4e86\uff0cy \u662f 0 \u7684\u539f\u56e0 divide \u51fd\u6570\u7684\u8f93\u5165\u53c2\u6570 y \u662f 0\uff0c\u90a3\u4e48\u662f\u8c01\u8c03\u7528\u4e86\u8fd9\u4e2a\u51fd\u6570\u5462\uff1f\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528 <strong>\u67e5\u770b\u8c03\u7528\u6808<\/strong> \u529f\u80fd (bt\u547d\u4ee4)<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(gdb) bt\n#0  0x0000555555554608 in divide (x=10, y=0) at debug.cpp:2\n#1  0x0000555555554631 in main () at debug.cpp:6\n<\/code><\/pre>\n\n\n\n<p>\u6211\u4eec\u53ef\u4ee5\u770b\u51fa\uff0c\u662fdebug.cpp \u7684\u7b2c 6 \u884c main \u51fd\u6570\u8c03\u7528\u4e86 divide \u51fd\u6570\uff0c\u8fd8\u80fd\u770b\u5230divide \u51fd\u6570\u7684\u5b9e\u53c2\u662f x = 10, y = 0.<br>\u6b64\u65f6\u6211\u4eec\u5e94\u5f53\u4f7f\u7528<strong>\u5207\u6362\u6808\u5e27<\/strong> (frame\u547d\u4ee4) \u56de\u5230 main \u51fd\u6570\u67e5\u770b\u8c03\u7528 divide \u7684\u4ee3\u7801. <code>#1<\/code> \u4ee3\u8868main \u51fd\u6570\u7684\u6808\u5e27\u7f16\u53f7\u4e3a 1<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(gdb) f 1\n#1  0x0000555555554634 in main () at debug.cpp:6\n6           int j = divide(10, i - 1);\n(gdb) l\n1   int divide(int x, int y) {\n2       return x \/ y;\n3   }\n4   int main() {\n5       for (int i = 10; i &gt;= 0; i--) {\n6           int j = divide(10, i - 1);\n7       }\n8   }\n<\/code><\/pre>\n\n\n\n<p>\u6211\u4eec\u901a\u8fc7\u5207\u6362\u6808\u5e27\u548c\u6253\u5370\u4ee3\u7801\u770b\u5230\uff0c\u4f20\u7ed9 divide \u51fd\u6570\u7684 y \u53c2\u6570\u662f \u5faa\u73af\u53d8\u91cf i. \u6211\u4eec\u53ef\u4ee5\u6253\u5370\u6b64\u65f6 i \u7684\u503c<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(gdb) p i\n$3 = 1\n(gdb) p i - 1\n$4 = 0\n<\/code><\/pre>\n\n\n\n<p>print \u6307\u4ee4\u4e0d\u4ec5\u53ef\u4ee5\u67e5\u770b\u53d8\u91cf\u7684\u503c\uff0c\u8fd8\u80fd\u8fdb\u884c\u7b80\u5355\u7684\u8fd0\u7b97\uff0c\u4f8b\u5982\u5bf9vector\u7684\u5143\u7d20\u7684\u8bbf\u95ee\uff0c\u53ef\u4ee5\u76f4\u63a5 <code>p vec[10]<\/code> \u8fd9\u6837\u64cd\u4f5c\u3002<\/p>\n\n\n\n<p>\u6700\u540e\u6211\u4eec\u5c1d\u8bd5\u4e0b<strong>\u65ad\u70b9<\/strong> (breakpoint). \u53ea\u8981gdb\u7b49\u5f85\u4f60\u7684\u8f93\u5165\uff0c\u4f60\u5c31\u53ef\u4ee5\u6dfb\u52a0\u65ad\u70b9\uff0c\u6bd4\u5982\u6211\u4eec\u7ed9 main \u51fd\u6570\u7684 \u7b2c6\u884c\u6dfb\u52a0\u65ad\u70b9\u5e76\u91cd\u65b0\u8fd0\u884c<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(gdb) b main.cpp:6\nNo source file named main.cpp.\nMake breakpoint pending on future shared library load? (y or &#91;n]) n\n(gdb) b debug.cpp:6\nBreakpoint 1 at 0x555555554622: file debug.cpp, line 6.\n(gdb) r\nThe program being debugged has been started already.\nStart it from the beginning? (y or n) y\nStarting program: \/home\/comzyh\/Projects\/tmp\/a.out\n\nBreakpoint 1, main () at debug.cpp:6\n6           int j = divide(10, i - 1);\n(gdb) p i\n$3 = 10\n<\/code><\/pre>\n\n\n\n<p>GDB \u7684\u786e\u5e2e\u6211\u4eec\u4e2d\u65ad\u4e86\u7a0b\u5e8f\u5e76\u8fdb\u5165\u8c03\u8bd5\uff0c\u6b64\u65f6\u6211\u4eec\u53ef\u4ee5<strong>\u7ee7\u7eed<\/strong>(continue)<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(gdb) c\nContinuing.\n\nBreakpoint 1, main () at debug.cpp:6\n6           int j = divide(10, i - 1);\n<\/code><\/pre>\n\n\n\n<p>\u65ad\u70b9\u4e0d\u662f\u4e00\u6b21\u6027\u7684\uff0c\u518d\u6b21\u6267\u884c\u4ee3\u7801\u4f1a\u518d\u6b21\u89e6\u53d1\u65ad\u70b9\u3002\u6b64\u65f6\u6211\u4eec\u53ef\u4ee5<strong>\u5220\u9664\u65ad\u70b9<\/strong>(d)\uff0c\u9700\u8981\u6307\u51fa\u65ad\u70b9\u7f16\u53f7<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(gdb) d 1\n(gdb) c\nContinuing.\n\nBreakpoint 2, main () at debug.cpp:6\n6           int j = divide(10, i - 1);\n<\/code><\/pre>\n\n\n\n<p>\u6700\u540e\uff0c<strong>\u9000\u51faGDB<\/strong> (quit)<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(gdb) quit\nA debugging session is active.\n\nInferior 1 &#91;process 15063] will be killed.\n\nQuit anyway? (y or n) y\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>GDB \u662f GNU \u63d0\u4f9b\u7684\u6d41\u884cDebug \u5de5\u5177\uff0cGDB \u53ef\u4ee5\u5bf9\u4efb\u4f55\u53ef\u6267\u884c\u6587\u4ef6\u8fdb\u884cDebug<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false}}},"categories":[1],"tags":[],"class_list":["post-1007","post","type-post","status-publish","format-standard","hentry","category-1"],"jetpack_publicize_connections":[],"aioseo_notices":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p6XQWE-gf","jetpack-related-posts":[],"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/comzyh.com\/blog\/wp-json\/wp\/v2\/posts\/1007","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/comzyh.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/comzyh.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/comzyh.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/comzyh.com\/blog\/wp-json\/wp\/v2\/comments?post=1007"}],"version-history":[{"count":15,"href":"https:\/\/comzyh.com\/blog\/wp-json\/wp\/v2\/posts\/1007\/revisions"}],"predecessor-version":[{"id":1089,"href":"https:\/\/comzyh.com\/blog\/wp-json\/wp\/v2\/posts\/1007\/revisions\/1089"}],"wp:attachment":[{"href":"https:\/\/comzyh.com\/blog\/wp-json\/wp\/v2\/media?parent=1007"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/comzyh.com\/blog\/wp-json\/wp\/v2\/categories?post=1007"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/comzyh.com\/blog\/wp-json\/wp\/v2\/tags?post=1007"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}