{"id":793,"date":"2017-12-12T19:50:35","date_gmt":"2017-12-12T11:50:35","guid":{"rendered":"https:\/\/damogame.cn:15443\/wordpress\/?p=793"},"modified":"2019-06-25T19:57:48","modified_gmt":"2019-06-25T11:57:48","slug":"gdb-%e5%85%a5%e9%97%a8%e6%95%99%e7%a8%8b%ef%bc%9a%e8%b0%83%e8%af%95-ncurses-%e7%9b%b8%e5%85%b3-bug-%e7%9a%84%e5%ae%8c%e6%95%b4%e8%8c%83%e4%be%8b","status":"publish","type":"post","link":"https:\/\/i007.cc\/wordpress\/archives\/793","title":{"rendered":"GDB \u5165\u95e8\u6559\u7a0b\uff1a\u8c03\u8bd5 ncurses \u76f8\u5173 bug \u7684\u5b8c\u6574\u8303\u4f8b"},"content":{"rendered":"<header class=\"post-header\">\n<div class=\"post-meta\"><span class=\"post-time\">\u53d1\u8868\u4e8e\u00a0<time datetime=\"2017-05-27T23:24:40+08:00\">2017 \u5e74 05 \u6708 27 \u65e5\u00a0<\/time><\/span><span class=\"post-category\">\u00a0 | \u00a0 \u5206\u7c7b\u4e8e\u00a0<a href=\"https:\/\/liam0205.me\/categories\/Computer-Skills\/\" rel=\"index\">Computer Skills\u00a0<\/a><\/span><span id=\"busuanzi_container_page_pv\">\u00a0 | \u00a0 \u672c\u6587\u5171\u88ab\u56f4\u89c2\u00a0<span id=\"busuanzi_value_page_pv\">488<\/span>\u00a0\u6b21<\/span><\/div>\n<\/header>\n<div class=\"post-body\">\n<p>\u8fd9\u662f\u4e00\u7bc7\u7531\u00a0<a href=\"https:\/\/liam0205.me\/\">Liam Huang<\/a>\u00a0\u7ffb\u8bd1\u7684\u8bd1\u6587\uff0c\u539f\u6587\u662f\u00a0<a href=\"http:\/\/www.brendangregg.com\/blog\/index.html\" target=\"_blank\" rel=\"external noopener noreferrer\">Brendan Gregg<\/a>\u00a0\u6240\u4f5c\u7684\u00a0<a href=\"http:\/\/www.brendangregg.com\/blog\/2016-08-09\/gdb-example-ncurses.html\" target=\"_blank\" rel=\"external noopener noreferrer\"><em>gdb Debugging Full Example (Tutorial): ncurses<\/em><\/a>\u3002\u8f6c\u8f7d\u8bf7\u4fdd\u7559\u672c\u6bb5\u6587\u5b57\uff0c\u5c0a\u91cd\u4f5c\u8005\u548c\u8bd1\u8005\u7684\u6743\u76ca\u3002<br \/>\nThe author of this work is\u00a0<a href=\"http:\/\/www.brendangregg.com\/blog\/index.html\" target=\"_blank\" rel=\"external noopener noreferrer\">Brendan Gregg<\/a>\u00a0and this work was firstly posted on\u00a0<a href=\"http:\/\/www.brendangregg.com\/blog\/2016-08-09\/gdb-example-ncurses.html\" target=\"_blank\" rel=\"external noopener noreferrer\"><em>gdb Debugging Full Example (Tutorial): ncurses<\/em><\/a>. This is the translation of the original work, by\u00a0<a href=\"https:\/\/liam0205.me\/\">Liam Huang<\/a>. Please keep this information at the very top of your reprint, for the rights of the author and the translator.<\/p>\n<p>\u5f53\u6211\u5c1d\u8bd5\u5728\u7f51\u4e0a\u5bfb\u627e\u300cGDB \u8303\u4f8b\u300d\u65f6\uff0c\u6211\u53d1\u73b0\u5927\u591a\u6570\u6587\u7ae0\u53ea\u662f\u8d34\u51fa\u4e86\u547d\u4ee4\uff0c\u800c\u6ca1\u6709\u8bb2\u89e3\u76f8\u5173\u8f93\u51fa\u3002GDB \u662f GNU \u8c03\u8bd5\u5668\uff08GNU Debugger\uff09\uff0c\u4ea6\u662f Linux \u7cfb\u7edf\u4e0a\u7684\u6807\u51c6\u8c03\u8bd5\u5668\u3002\u5728\u542c Greg Law \u5728 CppCon 2015 \u4e0a\u5173\u4e8e GDB \u7684\u6f14\u8bb2\u65f6\uff08<a href=\"http:\/\/undo.io\/resources\/presentations\/cppcon-2015-greg-law-give-me-15-minutes-ill-change\/\" target=\"_blank\" rel=\"external noopener noreferrer\">Give me 15 minutes and I\u2019ll change your view of GDB<\/a>\uff09\uff0c\u6211\u53d1\u73b0 Law \u7ed9\u51fa\u4e86\u76f8\u5173\u8f93\u51fa\uff0c\u4ece\u800c\u610f\u8bc6\u5230\u4e86\u4e0a\u8ff0\u4e0d\u8db3\u3002<\/p>\n<p>Law \u7684\u6f14\u8bb2\uff0c\u4e5f\u8ba9\u6211\u610f\u8bc6\u5230\u5e94\u8be5\u5206\u4eab\u4e00\u4e2a\u4f7f\u7528 GDB \u89e3\u51b3\u95ee\u9898\u7684\u5b8c\u6574\u8303\u4f8b\uff1a\u5305\u62ec\u547d\u4ee4\u8f93\u51fa\u3001\u5404\u4e2a\u6b65\u9aa4\uff0c\u4ee5\u53ca\u4e00\u4e9b\u6b7b\u80e1\u540c\u3002\u4e5f\u5c31\u662f\u8bf4\uff0c\u8fd9\u7bc7\u6587\u7ae0\u5c06\u5206\u4eab\u4f7f\u7528 GDB \u8c03\u8bd5\u67e5\u9519\u7684\u4e00\u822c\u6b65\u9aa4\uff0c\u800c\u4e0d\u662f\u5176\u4ed6\u7279\u522b\u7684\u4e1c\u897f\u3002\u8fd9\u7bc7\u6587\u7ae0\u4ecb\u7ecd\u4e86 GDB \u7684\u57fa\u672c\u4f7f\u7528\u65b9\u6cd5\uff0c\u56e0\u6b64\u53ef\u4ee5\u4f5c\u4e3a\u6559\u7a0b\u4f7f\u7528\u3002\u4e0d\u8fc7\uff0c\u8fd8\u6709\u5f88\u591a\u4e1c\u897f\u6ca1\u6709\u4ecb\u7ecd\uff0c\u8bf7\u8c28\u8bb0\u5728\u5fc3\u3002<\/p>\n<p><a id=\"more\"><\/a>\u4ee5\u4e0b\u547d\u4ee4\uff0c\u5747\u662f\u4ee5\u00a0<code>root<\/code>\u00a0\u6743\u9650\u6267\u884c\u7684\u3002\u8fd9\u662f\u56e0\u4e3a\uff0c\u6211\u8c03\u8bd5\u7684\u7a0b\u5e8f\uff0c\u76ee\u524d\u9700\u8981\u4ee5\u00a0<code>root<\/code>\u00a0\u6743\u9650\u6267\u884c\u3002\u5728\u5b9e\u9645\u4f7f\u7528\u4e2d\uff0c\u5e76\u4e0d\u662f\u6240\u6709\u6240\u9700\u7684\u547d\u4ee4\u90fd\u9700\u8981\u00a0<code>root<\/code>\u00a0\u6743\u9650\u3002\u6b64\u5916\uff0c\u672c\u6587\u7f57\u5217\u4e86\u89e3\u51b3\u95ee\u9898\u7684\u6bcf\u4e00\u4e2a\u6b65\u9aa4\uff0c\u4f60\u53ef\u4ee5\u53ea\u6d4f\u89c8\u4f60\u611f\u5174\u8da3\u7684\u90e8\u5206\u3002<\/p>\n<h2 id=\"\u4e00_\u00b7_\u95ee\u9898\u6765\u4e86\">\u4e00 \u00b7 \u95ee\u9898\u6765\u4e86<\/h2>\n<p><a href=\"https:\/\/github.com\/iovisor\/bcc\" target=\"_blank\" rel=\"external noopener noreferrer\">bcc<\/a>\u00a0\u5de5\u5177\u96c6\u662f BPF \u5de5\u5177\u7bb1\u7684\u4e00\u90e8\u5206\u3002\u6709\u4eba\u63d0\u8d77\u4e86\u4e00\u4e2a PR (Pull Request)\uff0c\u4fee\u6539\u4e86\u5176\u4e2d\u7684\u00a0<a href=\"https:\/\/github.com\/iovisor\/bcc\/blob\/master\/tools\/cachetop.py\" target=\"_blank\" rel=\"external noopener noreferrer\">cachetop<\/a>\u00a0\u4ee5\u4f7f\u7528 top-like display \u663e\u793a page cache \u7684\u7edf\u8ba1\u3002\u5f53\u6211\u5bf9\u8fd9\u4e2a PR \u8fdb\u884c\u6d4b\u8bd5\u65f6\uff0c\u7a0b\u5e8f\u63d0\u793a\u6bb5\u9519\u8bef\uff08segfault\uff09<\/p>\n<figure class=\"highlight bash\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span>\r\n<span class=\"line\">2<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\"><span class=\"comment\"># .\/cachetop.py<\/span><\/span>\r\n<span class=\"line\">Segmentation fault<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0cLinux \u63d0\u793a\u7a0b\u5e8f\u9047\u5230\u300c\u6bb5\u9519\u8bef\u00a0<code>Segmentation fault<\/code>\u300d\uff0c\u800c\u4e0d\u662f\u300c\u6bb5\u9519\u8bef\uff08\u6838\u5fc3\u5df2\u8f6c\u50a8\uff09<code>Segmentation fault (Core Dumped)<\/code>\u300d\u3002\u800c\u6b64\u5904\uff0c\u6211\u5e0c\u671b\u80fd\u901a\u8fc7\u6838\u5fc3\u8f6c\u50a8\u6587\u4ef6\uff0c\u5bf9\u9519\u8bef\u8fdb\u884c\u8c03\u8bd5\u3002\uff08\u6838\u5fc3\u8f6c\u50a8\u6587\u4ef6\u662f\u8fdb\u7a0b\u5185\u5b58\u7a7a\u95f4\u7684\u62f7\u8d1d\uff0c\u56e0\u6b64\u53ef\u4ee5\u7528\u4e8e\u8c03\u8bd5\uff1b\u8fd9\u4e2a\u672f\u8bed\u6e90\u81ea\u65e9\u5e74\u7684\u78c1\u6027\u6838\u5fc3\u8bb0\u5fc6\u4f53\uff09<\/p>\n<p>\u5206\u6790\u6838\u5fc3\u8f6c\u50a8\u6587\u4ef6\uff0c\u662f\u8c03\u8bd5\u67e5\u9519\u7684\u624b\u6bb5\u4e4b\u4e00\u3002\u4e0d\u8fc7\uff0c\u4e5f\u6709\u5176\u4ed6\u7684\u8c03\u8bd5\u529e\u6cd5\u3002\u6bd4\u5982\uff0c\u5728\u7a0b\u5e8f\u6267\u884c\u65f6\uff0c\u4f7f\u7528 GDB \u68c0\u67e5\u95ee\u9898\uff1b\u53c8\u6216\u8005\u4f7f\u7528\u5916\u90e8\u5de5\u5177\uff0c\u6536\u96c6\u6bb5\u9519\u8bef\u53d1\u751f\u65f6\u7684\u6570\u636e\u548c\u5806\u6808\u4fe1\u606f\u3002\u4e0d\u8fc7\uff0c\u6b64\u5904\u6211\u4eec\u4ece\u6838\u5fc3\u8f6c\u50a8\u6587\u4ef6\u7684\u5206\u6790\u5f00\u59cb\u3002<\/p>\n<h2 id=\"\u4e8c_\u00b7_\u83b7\u5f97\u6838\u5fc3\u8f6c\u50a8\u6587\u4ef6\">\u4e8c \u00b7 \u83b7\u5f97\u6838\u5fc3\u8f6c\u50a8\u6587\u4ef6<\/h2>\n<p>\u9996\u5148\uff0c\u6211\u9700\u8981\u68c0\u67e5\u4e00\u4e0b\u5173\u4e8e\u6838\u5fc3\u8f6c\u50a8\u7684\u8bbe\u7f6e\u3002<\/p>\n<figure class=\"highlight bash\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span>\r\n<span class=\"line\">2<\/span>\r\n<span class=\"line\">3<\/span>\r\n<span class=\"line\">4<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\"><span class=\"comment\"># ulimit -c<\/span><\/span>\r\n<span class=\"line\"><span class=\"number\">0<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\"># cat \/proc\/sys\/kernel\/core_pattern<\/span><\/span>\r\n<span class=\"line\">core<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p><code>ulimit -c<\/code>\u00a0\u662f Linux \u7684\u7cfb\u7edf\u8bbe\u7f6e\u4e4b\u4e00\uff0c\u7528\u4e8e\u9650\u5236\u751f\u6210\u6838\u5fc3\u8f6c\u50a8\u6587\u4ef6\u7684\u6700\u5927\u4f53\u79ef\u3002\u6b64\u5904\uff0c\u63d0\u793a\u4e0d\u5141\u8bb8\u8f6c\u50a8\u8fdb\u7a0b\u5185\u5b58\u3002<\/p>\n<p>\u53e6\u4e00\u65b9\u9762\uff0c<code>\/proc\/sys\/kernel\/core_pattern<\/code>\u00a0\u7684\u5185\u5bb9\u662f\u00a0<code>core<\/code>\u3002\u8fd9\u610f\u5473\u7740\uff0c\u53d1\u751f\u6838\u5fc3\u8f6c\u50a8\u65f6\uff0cLinux \u4f1a\u5c06\u8fdb\u7a0b\u5185\u5b58\u7a7a\u95f4\u8f6c\u50a8\u5230\u5f53\u524d\u76ee\u5f55\u4e0b\u540d\u4e3a\u00a0<code>core<\/code>\u00a0\u7684\u6587\u4ef6\u5f53\u4e2d\u3002\u5bf9\u4e8e\u89e3\u51b3\u5f53\u524d\u95ee\u9898\uff0c\u8fd9\u6837\u7684\u8bbe\u7f6e\u6ca1\u4ec0\u4e48\u95ee\u9898\u3002\u4e0d\u8fc7\uff0c\u6211\u4f1a\u5e0c\u671b\u5c06\u5176\u5b58\u5728\u67d0\u4e2a\u56fa\u5b9a\u7684\u76ee\u5f55\u4e2d\u3002<\/p>\n<figure class=\"highlight bash\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span>\r\n<span class=\"line\">2<\/span>\r\n<span class=\"line\">3<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\"><span class=\"comment\"># ulimit -c unlimited<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\"># mkdir \/var\/cores<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\"># echo \"\/var\/cores\/core.%e.%p\" &gt; \/proc\/sys\/kernel\/core_pattern<\/span><\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u4f60\u4e5f\u53ef\u4ee5\u8fdb\u4e00\u6b65\u8c03\u6574\u00a0<code>core_pattern<\/code>\u3002\u6bd4\u5982\u8bf4\uff0c<code>%h<\/code>\u00a0\u8868\u793a\u673a\u5668\u540d\u79f0\uff0c<code>%t<\/code>\u00a0\u8868\u793a\u8f6c\u50a8\u53d1\u751f\u7684\u65f6\u95f4\u3002\u8fd9\u4e9b Linux \u5185\u6838\u53c2\u6570\u7684\u6587\u6863\u5728<a href=\"https:\/\/www.kernel.org\/doc\/Documentation\/sysctl\/kernel.txt\" target=\"_blank\" rel=\"external noopener noreferrer\">\u8fd9\u91cc<\/a>\u3002<\/p>\n<p>\u5982\u679c\u60f3\u8981\u6c38\u4e45\u66f4\u6539\u00a0<code>core_pattern<\/code>\u00a0\u7684\u8bbe\u7f6e\uff0c\u4f60\u53ef\u4ee5\u4fee\u6539\u00a0<code>\/etc\/sysctl.conf<\/code>\u00a0\u6587\u4ef6\u4e2d\u7684\u00a0<code>kernel.core_pattern<\/code>\u3002<\/p>\n<p>\u5982\u6b64\uff0c\u518d\u8bd5\u8bd5\u770b\u3002<\/p>\n<figure class=\"highlight bash\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span>\r\n<span class=\"line\">2<\/span>\r\n<span class=\"line\">3<\/span>\r\n<span class=\"line\">4<\/span>\r\n<span class=\"line\">5<\/span>\r\n<span class=\"line\">6<\/span>\r\n<span class=\"line\">7<\/span>\r\n<span class=\"line\">8<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\"><span class=\"comment\"># .\/cachetop.py<\/span><\/span>\r\n<span class=\"line\">Segmentation fault (core dumped)<\/span>\r\n<span class=\"line\"><span class=\"comment\"># ls -lh \/var\/cores<\/span><\/span>\r\n<span class=\"line\">total <span class=\"number\">19<\/span>M<\/span>\r\n<span class=\"line\">-rw------- <span class=\"number\">1<\/span> root root <span class=\"number\">20<\/span>M Aug  <span class=\"number\">7<\/span> <span class=\"number\">22<\/span>:<span class=\"number\">15<\/span> core.python.<span class=\"number\">30520<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\"># file \/var\/cores\/core.python.30520<\/span><\/span>\r\n<span class=\"line\">\/var\/cores\/core.python.<span class=\"number\">30520<\/span>: ELF <span class=\"number\">64<\/span>-bit LSB core file x86-<span class=\"number\">64<\/span>, version <span class=\"number\">1<\/span> (SYSV), SVR4-style, from <span class=\"string\">'python .\/cachetop.py'<\/span><\/span>\r\n<span class=\"line\">That<span class=\"string\">'s better: we have our core dump.<\/span><\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u8fd9\u6837\u4e00\u6765\uff0c\u6211\u4eec\u5c31\u6709\u6838\u5fc3\u8f6c\u50a8\u6587\u4ef6\u4e86\u3002<\/p>\n<h2 id=\"\u4e09_\u00b7_\u542f\u52a8_GDB\">\u4e09 \u00b7 \u542f\u52a8 GDB<\/h2>\n<p>\u73b0\u5728\uff0c\u6211\u53ef\u4ee5\u542f\u52a8 GDB\uff0c\u8c03\u8bd5\u76ee\u6807\u7a0b\u5e8f\u548c\u6838\u5fc3\u8f6c\u50a8\u6587\u4ef6\u4e86\u3002\uff08\u8fd9\u91cc\u4f7f\u7528\u4e86\u00a0<code>`which python`\u00a0<\/code>\u7684\u65b9\u5f0f\u83b7\u53d6\u7cfb\u7edf\u4e2d\u00a0<code>python<\/code>\u00a0\u7684\u7edd\u5bf9\u8def\u5f84\uff09<\/p>\n<figure class=\"highlight bash\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span>\r\n<span class=\"line\">2<\/span>\r\n<span class=\"line\">3<\/span>\r\n<span class=\"line\">4<\/span>\r\n<span class=\"line\">5<\/span>\r\n<span class=\"line\">6<\/span>\r\n<span class=\"line\">7<\/span>\r\n<span class=\"line\">8<\/span>\r\n<span class=\"line\">9<\/span>\r\n<span class=\"line\">10<\/span>\r\n<span class=\"line\">11<\/span>\r\n<span class=\"line\">12<\/span>\r\n<span class=\"line\">13<\/span>\r\n<span class=\"line\">14<\/span>\r\n<span class=\"line\">15<\/span>\r\n<span class=\"line\">16<\/span>\r\n<span class=\"line\">17<\/span>\r\n<span class=\"line\">18<\/span>\r\n<span class=\"line\">19<\/span>\r\n<span class=\"line\">20<\/span>\r\n<span class=\"line\">21<\/span>\r\n<span class=\"line\">22<\/span>\r\n<span class=\"line\">23<\/span>\r\n<span class=\"line\">24<\/span>\r\n<span class=\"line\">25<\/span>\r\n<span class=\"line\">26<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\"><span class=\"comment\"># gdb `which python` \/var\/cores\/core.python.30520<\/span><\/span>\r\n<span class=\"line\">GNU gdb (Ubuntu <span class=\"number\">7.11<\/span>.<span class=\"number\">1<\/span>-<span class=\"number\">0<\/span>ubuntu1~<span class=\"number\">16.04<\/span>) <span class=\"number\">7.11<\/span>.<span class=\"number\">1<\/span><\/span>\r\n<span class=\"line\">Copyright (C) <span class=\"number\">2016<\/span> Free Software Foundation, Inc.<\/span>\r\n<span class=\"line\">License GPLv3+: GNU GPL version <span class=\"number\">3<\/span> or later<\/span>\r\n<span class=\"line\">This is free software: you are free to change and redistribute it.<\/span>\r\n<span class=\"line\">There is NO WARRANTY, to the extent permitted by law.  Type <span class=\"string\">\"show copying\"<\/span><\/span>\r\n<span class=\"line\">and <span class=\"string\">\"show warranty\"<\/span> <span class=\"keyword\">for<\/span> details.<\/span>\r\n<span class=\"line\">This GDB was configured as <span class=\"string\">\"x86_64-linux-gnu\"<\/span>.<\/span>\r\n<span class=\"line\">Type <span class=\"string\">\"show configuration\"<\/span> <span class=\"keyword\">for<\/span> configuration details.<\/span>\r\n<span class=\"line\">For bug reporting instructions, please see:<\/span>\r\n<span class=\"line\">.<\/span>\r\n<span class=\"line\">Find the GDB manual and other documentation resources online at:<\/span>\r\n<span class=\"line\">.<\/span>\r\n<span class=\"line\">For <span class=\"built_in\">help<\/span>, <span class=\"built_in\">type<\/span> <span class=\"string\">\"help\"<\/span>.<\/span>\r\n<span class=\"line\">Type <span class=\"string\">\"apropos word\"<\/span> to search <span class=\"keyword\">for<\/span> commands related to <span class=\"string\">\"word\"<\/span>...<\/span>\r\n<span class=\"line\">Reading symbols from \/usr\/bin\/python...(no debugging symbols found)...done.<\/span>\r\n\r\n<span class=\"line\">warning: core file may not match specified executable file.<\/span>\r\n<span class=\"line\">[New LWP <span class=\"number\">30520<\/span>]<\/span>\r\n<span class=\"line\">[Thread debugging using libthread_db enabled]<\/span>\r\n<span class=\"line\">Using host libthread_db library <span class=\"string\">\"\/lib\/x86_64-linux-gnu\/libthread_db.so.1\"<\/span>.<\/span>\r\n\r\n<span class=\"line\">warning: JITed object file architecture unknown is not compatible with target architecture i386:x86-<span class=\"number\">64<\/span>.<\/span>\r\n<span class=\"line\">Core was generated by `python .\/cachetop.py<span class=\"string\">'.<\/span>\r\nProgram terminated with signal SIGSEGV, Segmentation fault.\r\n#0  0x00007f0a37aac40d in doupdate () from \/lib\/x86_64-linux-gnu\/libncursesw.so.5<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u6700\u540e\u4e24\u884c\u5305\u542b\u6709\u8da3\u7684\u4fe1\u606f\uff1a\u5b83\u544a\u8bc9\u6211\u4eec\uff0c\u6bb5\u9519\u8bef\u53d1\u751f\u5728\u00a0<code>libncursesw<\/code>\u00a0\u5e93\u7684\u00a0<code>doupdate()<\/code>\u00a0\u51fd\u6570\u4e2d\u3002\u8fd9\u7c7b\u95ee\u9898\uff0c\u53ef\u4ee5\u8003\u8651\u5728\u7f51\u4e0a\u68c0\u7d22\uff0c\u770b\u770b\u662f\u5426\u662f\u5df2\u77e5\u95ee\u9898\u3002\u5f53\u7136\uff0c\u6211\u9047\u5230\u7684\u8fd9\u4e2a\u95ee\u9898\uff0c\u6ca1\u6709\u5176\u4ed6\u4eba\u62a5\u544a\u8fc7\u3002<\/p>\n<p>\u5bf9\u6211\u6765\u8bf4\uff0c\u6211\u5927\u6982\u80fd\u731c\u5230\u00a0<code>libncursesw<\/code>\u00a0\u662f\u505a\u4ec0\u4e48\u7684\u3002\u4e0d\u8fc7\uff0c\u5982\u679c\u5bf9\u4f60\u6765\u8bf4\u8fd9\u5f88\u964c\u751f\u7684\u8bdd\uff0c\u9996\u5148\u4f60\u5e94\u8be5\u77e5\u9053\u00a0<code>\/lib<\/code>\u00a0\u5f00\u5934\u5e76\u4ee5\u00a0<code>*.so<\/code>\u00a0\u7ed3\u5c3e\u8bf4\u660e\u5b83\u662f\u4e00\u4e2a\u5171\u4eab\u5bf9\u8c61\uff08\u52a8\u6001\u5e93\uff09\u3002\u63a5\u4e0b\u6765\uff0c\u4f60\u53ef\u4ee5\u5c1d\u8bd5\u901a\u8fc7\u00a0<code>man<\/code>\u00a0\u547d\u4ee4\u3001\u7f51\u9875\u3001\u8f6f\u4ef6\u5305\u8bf4\u660e\u7b49\u65b9\u5f0f\uff0c\u5f04\u6e05\u695a\u5b83\u662f\u505a\u4ec0\u4e48\u7684\u3002<\/p>\n<figure class=\"highlight bash\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span>\r\n<span class=\"line\">2<\/span>\r\n<span class=\"line\">3<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\"><span class=\"comment\"># dpkg -l | grep libncursesw<\/span><\/span>\r\n<span class=\"line\">ii  libncursesw5:amd64                  <span class=\"number\">6.0<\/span>+<span class=\"number\">20160213<\/span>-<span class=\"number\">1<\/span>ubuntu1                    amd64<\/span>\r\n<span class=\"line\">     shared libraries <span class=\"keyword\">for<\/span> terminal handling (wide character support)<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u6211\u8fd9\u91cc\u662f\u5728 Ubuntu \u4e0a\u8c03\u8bd5\uff0c\u4e0d\u8fc7\uff0c\u5728\u5176\u4ed6 Linux \u53d1\u884c\u4e0a\u8c03\u8bd5\u4e5f\u57fa\u672c\u6ca1\u5dee\u3002<\/p>\n<h2 id=\"\u56db_\u00b7_\u9006\u5411\u8ffd\u6eaf\">\u56db \u00b7 \u9006\u5411\u8ffd\u6eaf<\/h2>\n<p>\u9006\u5411\u8ffd\u6eaf\u8c03\u7528\u6808\uff0c\u80fd\u8ba9\u6211\u4eec\u77e5\u9053\u7a0b\u5e8f\u662f\u5982\u4f55\u4e00\u6b65\u6b65\u8c03\u7528\u76f4\u5230\u51fa\u73b0\u95ee\u9898\u7684\u3002\u5bf9\u4e8e\u4e00\u822c\u7684\u95ee\u9898\uff0c\u9006\u5411\u8ffd\u6eaf\u8c03\u7528\u6808\uff0c\u5c31\u8db3\u591f\u5b9a\u4f4d\u51fa\u95ee\u9898\u4e86\u3002\u56e0\u6b64\uff0c\u6211\u5728 GDB \u4e2d\u90fd\u4f1a\u9996\u5148\u5c1d\u8bd5\u4f7f\u7528\u8fd9\u4e00\u547d\u4ee4\uff1a<code>bt<\/code>\uff08<code>backtrace<\/code>\u00a0\u7684\u7f29\u5199\uff09\u3002<\/p>\n<figure class=\"highlight bash\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span>\r\n<span class=\"line\">2<\/span>\r\n<span class=\"line\">3<\/span>\r\n<span class=\"line\">4<\/span>\r\n<span class=\"line\">5<\/span>\r\n<span class=\"line\">6<\/span>\r\n<span class=\"line\">7<\/span>\r\n<span class=\"line\">8<\/span>\r\n<span class=\"line\">9<\/span>\r\n<span class=\"line\">10<\/span>\r\n<span class=\"line\">11<\/span>\r\n<span class=\"line\">12<\/span>\r\n<span class=\"line\">13<\/span>\r\n<span class=\"line\">14<\/span>\r\n<span class=\"line\">15<\/span>\r\n<span class=\"line\">16<\/span>\r\n<span class=\"line\">17<\/span>\r\n<span class=\"line\">18<\/span>\r\n<span class=\"line\">19<\/span>\r\n<span class=\"line\">20<\/span>\r\n<span class=\"line\">21<\/span>\r\n<span class=\"line\">22<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\">(gdb) bt<\/span>\r\n<span class=\"line\"><span class=\"comment\">#0  0x00007f0a37aac40d in doupdate () from \/lib\/x86_64-linux-gnu\/libncursesw.so.5<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#1  0x00007f0a37aa07e6 in wrefresh () from \/lib\/x86_64-linux-gnu\/libncursesw.so.5<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#2  0x00007f0a37a99616 in ?? () from \/lib\/x86_64-linux-gnu\/libncursesw.so.5<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#3  0x00007f0a37a9a325 in wgetch () from \/lib\/x86_64-linux-gnu\/libncursesw.so.5<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#4  0x00007f0a37cc6ec3 in ?? () from \/usr\/lib\/python2.7\/lib-dynload\/_curses.x86_64-linux-gnu.so<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#5  0x00000000004c4d5a in PyEval_EvalFrameEx ()<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#6  0x00000000004c2e05 in PyEval_EvalCodeEx ()<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#7  0x00000000004def08 in ?? ()<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#8  0x00000000004b1153 in PyObject_Call ()<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#9  0x00000000004c73ec in PyEval_EvalFrameEx ()<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#10 0x00000000004c2e05 in PyEval_EvalCodeEx ()<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#11 0x00000000004caf42 in PyEval_EvalFrameEx ()<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#12 0x00000000004c2e05 in PyEval_EvalCodeEx ()<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#13 0x00000000004c2ba9 in PyEval_EvalCode ()<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#14 0x00000000004f20ef in ?? ()<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#15 0x00000000004eca72 in PyRun_FileExFlags ()<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#16 0x00000000004eb1f1 in PyRun_SimpleFileExFlags ()<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#17 0x000000000049e18a in Py_Main ()<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#18 0x00007f0a3be10830 in __libc_start_main (main=0x49daf0 &lt;main&gt;, argc=2, argv=0x7ffd33d94838, init=&lt;optimized out&gt;, fini=&lt;optimized out&gt;, rtld_fini=&lt;optimized out&gt;,<\/span><\/span>\r\n<span class=\"line\">    stack_end=<span class=\"number\">0<\/span>x7ffd33d94828) at ..\/csu\/libc-start.c:<span class=\"number\">291<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#19 0x000000000049da19 in _start ()<\/span><\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u8fd9\u91cc\uff0c\u81ea\u5e95\u5411\u4e0a\u7684\u65b9\u5411\u5373\u662f\u8c03\u7528\u8005\u00a0<code>-&gt;<\/code>\u00a0\u88ab\u8c03\u7528\u7684\u65b9\u5411\u3002\u5176\u4e2d\u00a0<code>??<\/code>\u00a0\u8868\u793a\u7b26\u53f7\u8f6c\u4e49\u5931\u8d25\u3002\u904d\u5386\u8c03\u7528\u6808\u751f\u6210\u6808\u56de\u6eaf\u8bb0\u5f55\u7684\u8fc7\u7a0b\u4e5f\u6709\u53ef\u80fd\u5931\u8d25\u3002\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u4f60\u53ef\u80fd\u4f1a\u770b\u5230\u4e00\u4e2a\u5730\u5740\u503c\u5f88\u5c0f\u7684\u6808\u5e27\uff0c\u5f53\u7136\uff0c\u8fd9\u4e2a\u5730\u5740\u901a\u5e38\u662f\u9519\u8bef\u7684\u3002\u5982\u679c\u8fd9\u4e9b\u95ee\u9898\u5f88\u4e25\u91cd\uff0c\u90a3\u4e48\u5c31\u8981\u8003\u8651\u4fee\u590d\u8fd9\u4e9b\u95ee\u9898\uff1a\u5b89\u88c5\u76f8\u5e94\u8f6f\u4ef6\u5305\u7684\u8c03\u8bd5\u4fe1\u606f\u5305\uff08\u4e3a GDB \u63d0\u4f9b\u66f4\u591a\u7b26\u53f7\uff0c\u4e14\u5141\u8bb8 GDB \u505a\u57fa\u4e8e DWARF \u7684\u904d\u5386\uff09\uff0c\u6216\u662f\u5728\u7f16\u8bd1\u7a0b\u5e8f\u65f6\u7981\u6b62\u7f16\u8bd1\u5668\u4f18\u5316\u6808\u5e27\u6307\u9488\u5e76\u5305\u542b\u8c03\u8bd5\u4fe1\u606f\uff08<code>-fno-omit-frame-pointer -g<\/code>\uff09\u3002\u8fd9\u91cc\u7684\u00a0<code>??<\/code>\u00a0\u5728\u5b89\u88c5\u00a0<code>python-dbg<\/code>\u00a0\u8f6f\u4ef6\u5305\u4e4b\u540e\uff0c\u5927\u90fd\u90fd\u80fd\u89e3\u51b3\u3002<\/p>\n<p>\u4ec5\u4ece\u8c03\u7528\u6808\u6765\u770b\uff0c\u4fe1\u606f\u4f3c\u4e4e\u4e0d\u592a\u591f\uff1a<code>#5<\/code>\u00a0\u81f3\u00a0<code>#17<\/code>\u00a0\u662f\u5728 Python \u5185\u90e8\uff0c\u800c\u540e\u7ecf\u7531\u00a0<code>_curses<\/code>\u00a0\u5e93\u8c03\u7528\u8fdb\u5165\u00a0<code>libncursesw<\/code>\u3002\u5728\u00a0<code>libncursesw<\/code>\u00a0\u4e2d\uff0c<code>wgetch()-&gt;wrefresh()-&gt;doupdate()<\/code>\u00a0\u8c03\u7528\u987a\u5e8f\u770b\u8d77\u6765\u8fdb\u884c\u4e86\u4e00\u6b21\u7a97\u53e3\u5237\u65b0\u3002\u4f46\u662f\uff0c\u4e3a\u4ec0\u4e48\u8fd9\u4f1a\u5f15\u53d1\u6838\u5fc3\u8f6c\u50a8\u5462\uff1f<\/p>\n<h2 id=\"\u4e94_\u00b7_\u53cd\u6c47\u7f16\">\u4e94 \u00b7 \u53cd\u6c47\u7f16<\/h2>\n<p>\u63a5\u4e0b\u6765\uff0c\u6211\u8981\u53cd\u6c47\u7f16\u5bfc\u81f4\u6bb5\u9519\u8bef\u7684\u51fd\u6570\u00a0<code>doupdate()<\/code>\u3002<\/p>\n<figure class=\"highlight bash\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span>\r\n<span class=\"line\">2<\/span>\r\n<span class=\"line\">3<\/span>\r\n<span class=\"line\">4<\/span>\r\n<span class=\"line\">5<\/span>\r\n<span class=\"line\">6<\/span>\r\n<span class=\"line\">7<\/span>\r\n<span class=\"line\">8<\/span>\r\n<span class=\"line\">9<\/span>\r\n<span class=\"line\">10<\/span>\r\n<span class=\"line\">11<\/span>\r\n<span class=\"line\">12<\/span>\r\n<span class=\"line\">13<\/span>\r\n<span class=\"line\">14<\/span>\r\n<span class=\"line\">15<\/span>\r\n<span class=\"line\">16<\/span>\r\n<span class=\"line\">17<\/span>\r\n<span class=\"line\">18<\/span>\r\n<span class=\"line\">19<\/span>\r\n<span class=\"line\">20<\/span>\r\n<span class=\"line\">21<\/span>\r\n<span class=\"line\">22<\/span>\r\n<span class=\"line\">23<\/span>\r\n<span class=\"line\">24<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\">(gdb) disas doupdate<\/span>\r\n<span class=\"line\">Dump of assembler code <span class=\"keyword\">for<\/span> <span class=\"keyword\">function<\/span> doupdate:<\/span>\r\n<span class=\"line\">   <span class=\"number\">0<\/span>x00007f0a37aac2e0 &lt;+<span class=\"number\">0<\/span>&gt;:   push   %r15<\/span>\r\n<span class=\"line\">   <span class=\"number\">0<\/span>x00007f0a37aac2e2 &lt;+<span class=\"number\">2<\/span>&gt;:   push   %r14<\/span>\r\n<span class=\"line\">   <span class=\"number\">0<\/span>x00007f0a37aac2e4 &lt;+<span class=\"number\">4<\/span>&gt;:   push   %r13<\/span>\r\n<span class=\"line\">   <span class=\"number\">0<\/span>x00007f0a37aac2e6 &lt;+<span class=\"number\">6<\/span>&gt;:   push   %r12<\/span>\r\n<span class=\"line\">   <span class=\"number\">0<\/span>x00007f0a37aac2e8 &lt;+<span class=\"number\">8<\/span>&gt;:   push   %rbp<\/span>\r\n<span class=\"line\">   <span class=\"number\">0<\/span>x00007f0a37aac2e9 &lt;+<span class=\"number\">9<\/span>&gt;:   push   %rbx<\/span>\r\n<span class=\"line\">   <span class=\"number\">0<\/span>x00007f0a37aac2ea &lt;+<span class=\"number\">10<\/span>&gt;:  sub    <span class=\"variable\">$0xc8<\/span>,%rsp<\/span>\r\n<span class=\"line\">[...]<\/span>\r\n<span class=\"line\">---Type &lt;<span class=\"built_in\">return<\/span>&gt; to <span class=\"built_in\">continue<\/span>, or q &lt;<span class=\"built_in\">return<\/span>&gt; to quit---<\/span>\r\n<span class=\"line\">[...]<\/span>\r\n<span class=\"line\">   <span class=\"number\">0<\/span>x00007f0a37aac3f7 &lt;+<span class=\"number\">279<\/span>&gt;: cmpb   <span class=\"variable\">$0x0<\/span>,<span class=\"number\">0<\/span>x21(%rcx)<\/span>\r\n<span class=\"line\">   <span class=\"number\">0<\/span>x00007f0a37aac3fb &lt;+<span class=\"number\">283<\/span>&gt;: je     <span class=\"number\">0<\/span>x7f0a37aacc3b &lt;doupdate+<span class=\"number\">2395<\/span>&gt;<\/span>\r\n<span class=\"line\">   <span class=\"number\">0<\/span>x00007f0a37aac401 &lt;+<span class=\"number\">289<\/span>&gt;: mov    <span class=\"number\">0<\/span>x20cb68(%rip),%rax        <span class=\"comment\"># 0x7f0a37cb8f70<\/span><\/span>\r\n<span class=\"line\">   <span class=\"number\">0<\/span>x00007f0a37aac408 &lt;+<span class=\"number\">296<\/span>&gt;: mov    (%rax),%rsi<\/span>\r\n<span class=\"line\">   <span class=\"number\">0<\/span>x00007f0a37aac40b &lt;+<span class=\"number\">299<\/span>&gt;: xor    %eax,%eax<\/span>\r\n<span class=\"line\">=&gt; <span class=\"number\">0<\/span>x00007f0a37aac40d &lt;+<span class=\"number\">301<\/span>&gt;: mov    <span class=\"number\">0<\/span>x10(%rsi),%rdi<\/span>\r\n<span class=\"line\">   <span class=\"number\">0<\/span>x00007f0a37aac411 &lt;+<span class=\"number\">305<\/span>&gt;: cmpb   <span class=\"variable\">$0x0<\/span>,<span class=\"number\">0<\/span>x1c(%rdi)<\/span>\r\n<span class=\"line\">   <span class=\"number\">0<\/span>x00007f0a37aac415 &lt;+<span class=\"number\">309<\/span>&gt;: jne    <span class=\"number\">0<\/span>x7f0a37aac6f7 &lt;doupdate+<span class=\"number\">1047<\/span>&gt;<\/span>\r\n<span class=\"line\">   <span class=\"number\">0<\/span>x00007f0a37aac41b &lt;+<span class=\"number\">315<\/span>&gt;: movswl <span class=\"number\">0<\/span>x4(%rcx),%ecx<\/span>\r\n<span class=\"line\">   <span class=\"number\">0<\/span>x00007f0a37aac41f &lt;+<span class=\"number\">319<\/span>&gt;: movswl <span class=\"number\">0<\/span>x74(%rdx),%edi<\/span>\r\n<span class=\"line\">   <span class=\"number\">0<\/span>x00007f0a37aac423 &lt;+<span class=\"number\">323<\/span>&gt;: mov    %rax,<span class=\"number\">0<\/span>x40(%rsp)<\/span>\r\n<span class=\"line\">[...]<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u8fd9\u91cc\u7684\u8f93\u51fa\u505a\u4e86\u9002\u5f53\u7684\u622a\u65ad\u3002\uff08\u6211\u4e5f\u53ef\u4ee5\u76f4\u63a5\u8f93\u5165\u00a0<code>disas<\/code>\uff0c\u4ee5\u67e5\u770b\u5f53\u524d\u51fd\u6570\u7684\u6c47\u7f16\u4ee3\u7801\uff09<\/p>\n<p><code>=&gt;<\/code>\u00a0\u7bad\u5934\u6807\u6ce8\u7684\u4f4d\u7f6e\uff0c\u5373\u662f\u4ea7\u751f\u6bb5\u9519\u8bef\u7684\u6307\u4ee4\u5730\u5740\u3002\u8be5\u6307\u4ee4\u4e2d\uff08<code>mov 0x10(%rsi),%rdi<\/code>\uff09\uff0c<code>%rsi<\/code>\u00a0\u5bc4\u5b58\u5668\u4fdd\u5b58\u4e86\u4e00\u4e2a\u5185\u5b58\u5730\u5740\uff0c\u4e4b\u524d\u7684\u00a0<code>0x10<\/code>\u00a0\u8868\u793a\u5728\u8fd9\u4e2a\u5185\u5b58\u5730\u5740\u7684\u57fa\u7840\u4e0a\u505a\u00a0<code>0x10<\/code>\u00a0\u7684\u504f\u79fb\uff1b<code>%rdi<\/code>\u00a0\u5219\u662f\u53e6\u4e00\u4e2a\u5bc4\u5b58\u5668\u3002\u8be5\u6307\u4ee4\u7684\u4f5c\u7528\uff0c\u662f\u5c06\u4e0a\u8ff0\u504f\u79fb\u8fc7\u7684\u5185\u5b58\u5730\u5740\u4e2d\u4fdd\u5b58\u7684\u5185\u5bb9\uff0c\u62f7\u8d1d\u5230\u00a0<code>%rdi<\/code>\u00a0\u5bc4\u5b58\u5668\u5f53\u4e2d\u3002\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u8981\u770b\u770b\u5bc4\u5b58\u5668\u7684\u72b6\u6001\u3002<\/p>\n<h2 id=\"\u516d_\u00b7_\u67e5\u770b\u5bc4\u5b58\u5668\u72b6\u6001\">\u516d \u00b7 \u67e5\u770b\u5bc4\u5b58\u5668\u72b6\u6001<\/h2>\n<p>\u4f7f\u7528\u547d\u4ee4\u00a0<code>i r<\/code>\uff08<code>info registers<\/code>\u00a0\u7684\u7f29\u5199\uff09\u53ef\u4ee5\u6253\u5370\u5bc4\u5b58\u5668\u72b6\u6001\u3002<\/p>\n<figure class=\"highlight bash\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span>\r\n<span class=\"line\">2<\/span>\r\n<span class=\"line\">3<\/span>\r\n<span class=\"line\">4<\/span>\r\n<span class=\"line\">5<\/span>\r\n<span class=\"line\">6<\/span>\r\n<span class=\"line\">7<\/span>\r\n<span class=\"line\">8<\/span>\r\n<span class=\"line\">9<\/span>\r\n<span class=\"line\">10<\/span>\r\n<span class=\"line\">11<\/span>\r\n<span class=\"line\">12<\/span>\r\n<span class=\"line\">13<\/span>\r\n<span class=\"line\">14<\/span>\r\n<span class=\"line\">15<\/span>\r\n<span class=\"line\">16<\/span>\r\n<span class=\"line\">17<\/span>\r\n<span class=\"line\">18<\/span>\r\n<span class=\"line\">19<\/span>\r\n<span class=\"line\">20<\/span>\r\n<span class=\"line\">21<\/span>\r\n<span class=\"line\">22<\/span>\r\n<span class=\"line\">23<\/span>\r\n<span class=\"line\">24<\/span>\r\n<span class=\"line\">25<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\">(gdb) i r<\/span>\r\n<span class=\"line\">rax            <span class=\"number\">0<\/span>x0  <span class=\"number\">0<\/span><\/span>\r\n<span class=\"line\">rbx            <span class=\"number\">0<\/span>x1993060    <span class=\"number\">26816608<\/span><\/span>\r\n<span class=\"line\">rcx            <span class=\"number\">0<\/span>x19902a0    <span class=\"number\">26804896<\/span><\/span>\r\n<span class=\"line\">rdx            <span class=\"number\">0<\/span>x19ce7d0    <span class=\"number\">27060176<\/span><\/span>\r\n<span class=\"line\">rsi            <span class=\"number\">0<\/span>x0  <span class=\"number\">0<\/span><\/span>\r\n<span class=\"line\">rdi            <span class=\"number\">0<\/span>x19ce7d0    <span class=\"number\">27060176<\/span><\/span>\r\n<span class=\"line\">rbp            <span class=\"number\">0<\/span>x7f0a3848eb10   <span class=\"number\">0<\/span>x7f0a3848eb10 &lt;SP&gt;<\/span>\r\n<span class=\"line\">rsp            <span class=\"number\">0<\/span>x7ffd33d93c00   <span class=\"number\">0<\/span>x7ffd33d93c00<\/span>\r\n<span class=\"line\">r8             <span class=\"number\">0<\/span>x7f0a37cb93e0   <span class=\"number\">139681862489056<\/span><\/span>\r\n<span class=\"line\">r9             <span class=\"number\">0<\/span>x0  <span class=\"number\">0<\/span><\/span>\r\n<span class=\"line\">r10            <span class=\"number\">0<\/span>x8  <span class=\"number\">8<\/span><\/span>\r\n<span class=\"line\">r11            <span class=\"number\">0<\/span>x202    <span class=\"number\">514<\/span><\/span>\r\n<span class=\"line\">r12            <span class=\"number\">0<\/span>x0  <span class=\"number\">0<\/span><\/span>\r\n<span class=\"line\">r13            <span class=\"number\">0<\/span>x0  <span class=\"number\">0<\/span><\/span>\r\n<span class=\"line\">r14            <span class=\"number\">0<\/span>x7f0a3848eb10   <span class=\"number\">139681870703376<\/span><\/span>\r\n<span class=\"line\">r15            <span class=\"number\">0<\/span>x19ce7d0    <span class=\"number\">27060176<\/span><\/span>\r\n<span class=\"line\">rip            <span class=\"number\">0<\/span>x7f0a37aac40d   <span class=\"number\">0<\/span>x7f0a37aac40d &lt;doupdate+<span class=\"number\">301<\/span>&gt;<\/span>\r\n<span class=\"line\">eflags         <span class=\"number\">0<\/span>x10246  [ PF ZF IF RF ]<\/span>\r\n<span class=\"line\">cs             <span class=\"number\">0<\/span>x33 <span class=\"number\">51<\/span><\/span>\r\n<span class=\"line\">ss             <span class=\"number\">0<\/span>x2b <span class=\"number\">43<\/span><\/span>\r\n<span class=\"line\">ds             <span class=\"number\">0<\/span>x0  <span class=\"number\">0<\/span><\/span>\r\n<span class=\"line\">es             <span class=\"number\">0<\/span>x0  <span class=\"number\">0<\/span><\/span>\r\n<span class=\"line\">fs             <span class=\"number\">0<\/span>x0  <span class=\"number\">0<\/span><\/span>\r\n<span class=\"line\">gs             <span class=\"number\">0<\/span>x0  <span class=\"number\">0<\/span><\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u597d\u5427\uff0c<code>%rsi<\/code>\u00a0\u8fd9\u4e2a\u5bc4\u5b58\u5668\u4e2d\uff0c\u4fdd\u5b58\u7684\u662f\u4e00\u4e2a\u7a7a\u6307\u9488\uff08<code>0x0<\/code>\uff09\u3002\u8fd9\u5c31\u602a\u4e0d\u5f97\u8981\u51fa\u95ee\u9898\u4e86\u3002\u89e3\u5f15\u7528\u4e00\u4e2a\u672a\u521d\u59cb\u5316\u7684\u6307\u9488\uff0c\u6216\u662f\u89e3\u5f15\u7528\u7a7a\u6307\u9488\uff0c\u662f\u6bb5\u9519\u8bef\u7684\u5e38\u89c1\u539f\u56e0\u3002<\/p>\n<h2 id=\"\u4e03_\u00b7_\u5185\u5b58\u6620\u5c04\">\u4e03 \u00b7 \u5185\u5b58\u6620\u5c04<\/h2>\n<p>\u4f60\u53ef\u4ee5\u518d\u786e\u8ba4\u4e00\u4e0b\u6b64\u65f6\u00a0<code>0x0<\/code>\u00a0\u662f\u5426\u662f\u6709\u6548\u7684\u5730\u5740\u3002\u5728 GDB \u4e2d\u4f7f\u7528\u00a0<code>i proc m<\/code>\uff08<code>info proc mappings<\/code>\u00a0\u7684\u7f29\u5199\uff09\u53ef\u4ee5\u67e5\u770b\u5185\u5b58\u6620\u5c04\u72b6\u6001\u3002<\/p>\n<figure class=\"highlight bash\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span>\r\n<span class=\"line\">2<\/span>\r\n<span class=\"line\">3<\/span>\r\n<span class=\"line\">4<\/span>\r\n<span class=\"line\">5<\/span>\r\n<span class=\"line\">6<\/span>\r\n<span class=\"line\">7<\/span>\r\n<span class=\"line\">8<\/span>\r\n<span class=\"line\">9<\/span>\r\n<span class=\"line\">10<\/span>\r\n<span class=\"line\">11<\/span>\r\n<span class=\"line\">12<\/span>\r\n<span class=\"line\">13<\/span>\r\n<span class=\"line\">14<\/span>\r\n<span class=\"line\">15<\/span>\r\n<span class=\"line\">16<\/span>\r\n<span class=\"line\">17<\/span>\r\n<span class=\"line\">18<\/span>\r\n<span class=\"line\">19<\/span>\r\n<span class=\"line\">20<\/span>\r\n<span class=\"line\">21<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\">(gdb) i proc m<\/span>\r\n<span class=\"line\">Mapped address spaces:<\/span>\r\n\r\n<span class=\"line\">      Start Addr           End Addr       Size     Offset objfile<\/span>\r\n<span class=\"line\">        <span class=\"number\">0<\/span>x400000           <span class=\"number\">0<\/span>x6e7000   <span class=\"number\">0<\/span>x2e7000        <span class=\"number\">0<\/span>x0 \/usr\/bin\/python2.<span class=\"number\">7<\/span><\/span>\r\n<span class=\"line\">        <span class=\"number\">0<\/span>x8e6000           <span class=\"number\">0<\/span>x8e8000     <span class=\"number\">0<\/span>x2000   <span class=\"number\">0<\/span>x2e6000 \/usr\/bin\/python2.<span class=\"number\">7<\/span><\/span>\r\n<span class=\"line\">        <span class=\"number\">0<\/span>x8e8000           <span class=\"number\">0<\/span>x95f000    <span class=\"number\">0<\/span>x77000   <span class=\"number\">0<\/span>x2e8000 \/usr\/bin\/python2.<span class=\"number\">7<\/span><\/span>\r\n<span class=\"line\">  <span class=\"number\">0<\/span>x7f0a37a8b000     <span class=\"number\">0<\/span>x7f0a37ab8000    <span class=\"number\">0<\/span>x2d000        <span class=\"number\">0<\/span>x0 \/lib\/x86_64-linux-gnu\/libncursesw.so.<span class=\"number\">5.9<\/span><\/span>\r\n<span class=\"line\">  <span class=\"number\">0<\/span>x7f0a37ab8000     <span class=\"number\">0<\/span>x7f0a37cb8000   <span class=\"number\">0<\/span>x200000    <span class=\"number\">0<\/span>x2d000 \/lib\/x86_64-linux-gnu\/libncursesw.so.<span class=\"number\">5.9<\/span><\/span>\r\n<span class=\"line\">  <span class=\"number\">0<\/span>x7f0a37cb8000     <span class=\"number\">0<\/span>x7f0a37cb9000     <span class=\"number\">0<\/span>x1000    <span class=\"number\">0<\/span>x2d000 \/lib\/x86_64-linux-gnu\/libncursesw.so.<span class=\"number\">5.9<\/span><\/span>\r\n<span class=\"line\">  <span class=\"number\">0<\/span>x7f0a37cb9000     <span class=\"number\">0<\/span>x7f0a37cba000     <span class=\"number\">0<\/span>x1000    <span class=\"number\">0<\/span>x2e000 \/lib\/x86_64-linux-gnu\/libncursesw.so.<span class=\"number\">5.9<\/span><\/span>\r\n<span class=\"line\">  <span class=\"number\">0<\/span>x7f0a37cba000     <span class=\"number\">0<\/span>x7f0a37ccd000    <span class=\"number\">0<\/span>x13000        <span class=\"number\">0<\/span>x0 \/usr\/lib\/python2.<span class=\"number\">7<\/span>\/lib-dynload\/_curses.x86_64-linux-gnu.so<\/span>\r\n<span class=\"line\">  <span class=\"number\">0<\/span>x7f0a37ccd000     <span class=\"number\">0<\/span>x7f0a37ecc000   <span class=\"number\">0<\/span>x1ff000    <span class=\"number\">0<\/span>x13000 \/usr\/lib\/python2.<span class=\"number\">7<\/span>\/lib-dynload\/_curses.x86_64-linux-gnu.so<\/span>\r\n<span class=\"line\">  <span class=\"number\">0<\/span>x7f0a37ecc000     <span class=\"number\">0<\/span>x7f0a37ecd000     <span class=\"number\">0<\/span>x1000    <span class=\"number\">0<\/span>x12000 \/usr\/lib\/python2.<span class=\"number\">7<\/span>\/lib-dynload\/_curses.x86_64-linux-gnu.so<\/span>\r\n<span class=\"line\">  <span class=\"number\">0<\/span>x7f0a37ecd000     <span class=\"number\">0<\/span>x7f0a37ecf000     <span class=\"number\">0<\/span>x2000    <span class=\"number\">0<\/span>x13000 \/usr\/lib\/python2.<span class=\"number\">7<\/span>\/lib-dynload\/_curses.x86_64-linux-gnu.so<\/span>\r\n<span class=\"line\">  <span class=\"number\">0<\/span>x7f0a38050000     <span class=\"number\">0<\/span>x7f0a38066000    <span class=\"number\">0<\/span>x16000        <span class=\"number\">0<\/span>x0 \/lib\/x86_64-linux-gnu\/libgcc_s.so.<span class=\"number\">1<\/span><\/span>\r\n<span class=\"line\">  <span class=\"number\">0<\/span>x7f0a38066000     <span class=\"number\">0<\/span>x7f0a38265000   <span class=\"number\">0<\/span>x1ff000    <span class=\"number\">0<\/span>x16000 \/lib\/x86_64-linux-gnu\/libgcc_s.so.<span class=\"number\">1<\/span><\/span>\r\n<span class=\"line\">  <span class=\"number\">0<\/span>x7f0a38265000     <span class=\"number\">0<\/span>x7f0a38266000     <span class=\"number\">0<\/span>x1000    <span class=\"number\">0<\/span>x15000 \/lib\/x86_64-linux-gnu\/libgcc_s.so.<span class=\"number\">1<\/span><\/span>\r\n<span class=\"line\">  <span class=\"number\">0<\/span>x7f0a38266000     <span class=\"number\">0<\/span>x7f0a3828b000    <span class=\"number\">0<\/span>x25000        <span class=\"number\">0<\/span>x0 \/lib\/x86_64-linux-gnu\/libtinfo.so.<span class=\"number\">5.9<\/span><\/span>\r\n<span class=\"line\">  <span class=\"number\">0<\/span>x7f0a3828b000     <span class=\"number\">0<\/span>x7f0a3848a000   <span class=\"number\">0<\/span>x1ff000    <span class=\"number\">0<\/span>x25000 \/lib\/x86_64-linux-gnu\/libtinfo.so.<span class=\"number\">5.9<\/span><\/span>\r\n<span class=\"line\">[...]<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u5982\u6b64\u53ef\u4ee5\u770b\u5230\uff0c\u865a\u5b58\u7a7a\u95f4\u6709\u6548\u5730\u5740\u7684\u6700\u4f4e\u4f4d\u662f\u00a0<code>0x400000<\/code>\u3002\u56e0\u6b64\uff0c\u663e\u800c\u6613\u89c1\u00a0<code>0x0<\/code>\u00a0\u6b64\u65f6\u662f\u4e00\u4e2a\u975e\u6cd5\u7684\u5730\u5740\uff0c\u6240\u4ee5\u4f7f\u7528\u5b83\u4f1a\u5bfc\u81f4\u6bb5\u9519\u8bef\u3002<\/p>\n<p>\u81f3\u6b64\u4e3a\u6b62\uff0c\u7ee7\u7eed\u6df1\u5165\u8fdb\u884c\u8c03\u8bd5\u7684\u65b9\u6cd5\u6709\u591a\u91cd\u3002\u6211\u5c06\u4ece\u6307\u4ee4\u7684\u89d2\u5ea6\u7ee7\u7eed\u6df1\u5165\u3002<\/p>\n<h2 id=\"\u516b_\u00b7_\u65ad\u70b9\">\u516b \u00b7 \u65ad\u70b9<\/h2>\n<p>\u56de\u5230\u521a\u624d\u7684\u53cd\u6c47\u7f16\u7684\u7ed3\u679c\u3002<\/p>\n<figure class=\"highlight bash\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span>\r\n<span class=\"line\">2<\/span>\r\n<span class=\"line\">3<\/span>\r\n<span class=\"line\">4<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\">   <span class=\"number\">0<\/span>x00007f0a37aac401 &lt;+<span class=\"number\">289<\/span>&gt;:   mov    <span class=\"number\">0<\/span>x20cb68(%rip),%rax        <span class=\"comment\"># 0x7f0a37cb8f70<\/span><\/span>\r\n<span class=\"line\">   <span class=\"number\">0<\/span>x00007f0a37aac408 &lt;+<span class=\"number\">296<\/span>&gt;:   mov    (%rax),%rsi<\/span>\r\n<span class=\"line\">   <span class=\"number\">0<\/span>x00007f0a37aac40b &lt;+<span class=\"number\">299<\/span>&gt;:   xor    %eax,%eax<\/span>\r\n<span class=\"line\">=&gt; <span class=\"number\">0<\/span>x00007f0a37aac40d &lt;+<span class=\"number\">301<\/span>&gt;:   mov    <span class=\"number\">0<\/span>x10(%rsi),%rdi<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u4ece\u6c47\u7f16\u6307\u4ee4\u6765\u770b\uff0c\u4ee3\u7801\u4f3c\u4e4e\u9996\u5148\u4ece\u6808\u4e0a\u5c06\u67d0\u4e2a\u4fe1\u606f\u62f7\u8d1d\u5230\u00a0<code>%rax<\/code>\u00a0\u5bc4\u5b58\u5668\u5f53\u4e2d\u3002\u800c\u540e\u89e3\u5f15\u7528\u00a0<code>%rax<\/code>\u00a0\u5bc4\u5b58\u5668\u91cc\u7684\u5185\u5bb9\uff0c\u5e76\u62f7\u8d1d\u5230\u00a0<code>%rsi<\/code>\u00a0\u5bc4\u5b58\u5668\u3002\u800c\u540e\u901a\u8fc7\u00a0<code>xor<\/code>\u00a0\u5c06\u00a0<code>%eax<\/code>\u00a0\u5bc4\u5b58\u5668\u4e2d\u7684\u5185\u5bb9\u7f6e\u96f6\u3002\u6700\u540e\u6267\u884c\u5230\u4ea7\u751f\u6bb5\u9519\u8bef\u7684\u4ee3\u7801\u3002\u5728\u8fd9\u91cc\uff0c<code>%eax<\/code>\u00a0\u6709\u53ef\u80fd\u63d0\u4f9b\u66f4\u591a\u7684\u4fe1\u606f\u3002\uff08\u8bd1\u6ce8\uff1a\u539f\u4f5c\u8005\u5199\u7684\u662f\u00a0<code>%rax<\/code>\uff0c\u8fd9\u5e94\u8be5\u662f\u624b\u8bef\uff09\u4f46\u662f\u5728\u6bb5\u9519\u8bef\u4e4b\u524d\uff0c\u5b83\u5df2\u7ecf\u88ab\u7f6e\u96f6\u4e86\uff0c\u56e0\u6b64\u6211\u4eec\u770b\u4e0d\u5230\u66f4\u591a\u7684\u4fe1\u606f\u3002<\/p>\n<p>\u6211\u53ef\u4ee5\u5c06\u65ad\u70b9\u8bbe\u7f6e\u5728\u00a0<code>doupdate+298<\/code>\u00a0\u5904\uff0c\u800c\u540e\u987a\u7740\u6307\u4ee4\u5355\u6b65\u8c03\u8bd5\uff0c\u770b\u770b\u5404\u4e2a\u5bc4\u5b58\u5668\u7684\u503c\u662f\u5982\u4f55\u53d8\u5316\u7684\u3002\u4e3a\u6b64\uff0c\u9996\u5148\u6211\u5f97\u542f\u52a8 GDB\uff0c\u4ee5\u4fbf\u5728\u5176\u4e2d\u5b9e\u65f6\u6267\u884c\u7a0b\u5e8f\u3002<\/p>\n<figure class=\"highlight bash\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span>\r\n<span class=\"line\">2<\/span>\r\n<span class=\"line\">3<\/span>\r\n<span class=\"line\">4<\/span>\r\n<span class=\"line\">5<\/span>\r\n<span class=\"line\">6<\/span>\r\n<span class=\"line\">7<\/span>\r\n<span class=\"line\">8<\/span>\r\n<span class=\"line\">9<\/span>\r\n<span class=\"line\">10<\/span>\r\n<span class=\"line\">11<\/span>\r\n<span class=\"line\">12<\/span>\r\n<span class=\"line\">13<\/span>\r\n<span class=\"line\">14<\/span>\r\n<span class=\"line\">15<\/span>\r\n<span class=\"line\">16<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\"><span class=\"comment\"># gdb `which python`<\/span><\/span>\r\n<span class=\"line\">GNU gdb (Ubuntu <span class=\"number\">7.11<\/span>.<span class=\"number\">1<\/span>-<span class=\"number\">0<\/span>ubuntu1~<span class=\"number\">16.04<\/span>) <span class=\"number\">7.11<\/span>.<span class=\"number\">1<\/span><\/span>\r\n<span class=\"line\">Copyright (C) <span class=\"number\">2016<\/span> Free Software Foundation, Inc.<\/span>\r\n<span class=\"line\">License GPLv3+: GNU GPL version <span class=\"number\">3<\/span> or later<\/span>\r\n<span class=\"line\">This is free software: you are free to change and redistribute it.<\/span>\r\n<span class=\"line\">There is NO WARRANTY, to the extent permitted by law.  Type <span class=\"string\">\"show copying\"<\/span><\/span>\r\n<span class=\"line\">and <span class=\"string\">\"show warranty\"<\/span> <span class=\"keyword\">for<\/span> details.<\/span>\r\n<span class=\"line\">This GDB was configured as <span class=\"string\">\"x86\\_64-linux-gnu\"<\/span>.<\/span>\r\n<span class=\"line\">Type <span class=\"string\">\"show configuration\"<\/span> <span class=\"keyword\">for<\/span> configuration details.<\/span>\r\n<span class=\"line\">For bug reporting instructions, please see:<\/span>\r\n<span class=\"line\">.<\/span>\r\n<span class=\"line\">Find the GDB manual and other documentation resources online at:<\/span>\r\n<span class=\"line\">.<\/span>\r\n<span class=\"line\">For <span class=\"built_in\">help<\/span>, <span class=\"built_in\">type<\/span> <span class=\"string\">\"help\"<\/span>.<\/span>\r\n<span class=\"line\">Type <span class=\"string\">\"apropos word\"<\/span> to search <span class=\"keyword\">for<\/span> commands related to <span class=\"string\">\"word\"<\/span>...<\/span>\r\n<span class=\"line\">Reading symbols from \/usr\/bin\/python...(no debugging symbols found)...done.<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u800c\u540e\uff0c\u4f7f\u7528\u00a0<code>b<\/code>\u00a0\u547d\u4ee4\uff08<code>break<\/code>\u00a0\u7684\u7f29\u5199\uff09\u8bbe\u7f6e\u65ad\u70b9\u3002<\/p>\n<figure class=\"highlight bash\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span>\r\n<span class=\"line\">2<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\">(gdb) b *doupdate + <span class=\"number\">289<\/span><\/span>\r\n<span class=\"line\">No symbol table is loaded.  Use the <span class=\"string\">\"file\"<\/span> command.<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u554a\uff0c\u51fa\u9519\u4e86\u2026\u2026\u8fd9\u662f\u6211\u6709\u610f\u5448\u73b0\u7684\u9519\u8bef\u3002\u901a\u5e38\uff0c\u6211\u4eec\u4f1a\u5c06\u65ad\u70b9\u9996\u5148\u8bbe\u7f6e\u5728\u00a0<code>main<\/code>\u00a0\u5904\uff0c\u56e0\u4e3a\u5f7c\u65f6\u7b26\u53f7\u5e94\u8be5\u90fd\u52a0\u8f7d\u5b8c\u6bd5\u4e86\u3002\u800c\u540e\uff0c\u5728\u7a0b\u5e8f\u9047\u5230\u65ad\u70b9\u5e76\u6682\u505c\u65f6\uff0c\u6211\u4eec\u53ef\u4ee5\u8bbe\u7f6e\u5176\u4ed6\u65ad\u70b9\u3002\u6b64\u5904\uff0c\u6211\u9700\u8981\u5173\u6ce8\u00a0<code>doupdate<\/code>\u00a0\u51fd\u6570\uff0c\u56e0\u6b64\uff0c\u6211\u5c06\u65ad\u70b9\u9996\u5148\u8bbe\u7f6e\u5728\u8fd9\u4e2a\u51fd\u6570\u88ab\u8c03\u7528\u7684\u5730\u65b9\u3002<\/p>\n<figure class=\"highlight bash\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span>\r\n<span class=\"line\">2<\/span>\r\n<span class=\"line\">3<\/span>\r\n<span class=\"line\">4<\/span>\r\n<span class=\"line\">5<\/span>\r\n<span class=\"line\">6<\/span>\r\n<span class=\"line\">7<\/span>\r\n<span class=\"line\">8<\/span>\r\n<span class=\"line\">9<\/span>\r\n<span class=\"line\">10<\/span>\r\n<span class=\"line\">11<\/span>\r\n<span class=\"line\">12<\/span>\r\n<span class=\"line\">13<\/span>\r\n<span class=\"line\">14<\/span>\r\n<span class=\"line\">15<\/span>\r\n<span class=\"line\">16<\/span>\r\n<span class=\"line\">17<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\">(gdb) b doupdate<\/span>\r\n<span class=\"line\">Function <span class=\"string\">\"doupdate\"<\/span> not defined.<\/span>\r\n<span class=\"line\">Make breakpoint pending on future shared library load? (y or [n]) y<\/span>\r\n<span class=\"line\">Breakpoint <span class=\"number\">1<\/span> (doupdate) pending.<\/span>\r\n<span class=\"line\">(gdb) r cachetop.py<\/span>\r\n<span class=\"line\">Starting program: \/usr\/bin\/python cachetop.py<\/span>\r\n<span class=\"line\">[Thread debugging using libthread_db enabled]<\/span>\r\n<span class=\"line\">Using host libthread_db library <span class=\"string\">\"\/lib\/x86_64-linux-gnu\/libthread_db.so.1\"<\/span>.<\/span>\r\n<span class=\"line\">warning: JITed object file architecture unknown is not compatible with target architecture i386:x86-<span class=\"number\">64<\/span>.<\/span>\r\n\r\n<span class=\"line\">Breakpoint <span class=\"number\">1<\/span>, <span class=\"number\">0<\/span>x00007ffff34ad2e0 <span class=\"keyword\">in<\/span> doupdate () from \/lib\/x86_64-linux-gnu\/libncursesw.so.<span class=\"number\">5<\/span><\/span>\r\n<span class=\"line\">(gdb) b *doupdate + <span class=\"number\">289<\/span><\/span>\r\n<span class=\"line\">Breakpoint <span class=\"number\">2<\/span> at <span class=\"number\">0<\/span>x7ffff34ad401<\/span>\r\n<span class=\"line\">(gdb) c<\/span>\r\n<span class=\"line\">Continuing.<\/span>\r\n\r\n<span class=\"line\">Breakpoint <span class=\"number\">2<\/span>, <span class=\"number\">0<\/span>x00007ffff34ad401 <span class=\"keyword\">in<\/span> doupdate () from \/lib\/x86_64-linux-gnu\/libncursesw.so.<span class=\"number\">5<\/span><\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u5982\u6b64\uff0c\u6211\u4eec\u5c31\u6765\u5230\u4e86\u76ee\u6807\u65ad\u70b9\u4f4d\u7f6e\u3002<\/p>\n<p>\u8fd9\u91cc\uff0c<code>r<\/code>\u00a0(<code>run<\/code>) \u547d\u4ee4\u5c06\u53c2\u6570\u4f20\u7ed9\u88ab GDB \u8ddf\u8e2a\u7684\u7a0b\u5e8f\uff08\u8fd9\u91cc\u662f\u00a0<code>python<\/code>\uff09\uff0c\u4ee5\u4fbf\u6267\u884c\u76ee\u6807 Python \u811a\u672c\u3002\u56e0\u6b64\uff0c\u8fd9\u91cc\u76f8\u5f53\u4e8e\u6267\u884c\u4e86\u00a0<code>python cachetop.py<\/code>\u3002<\/p>\n<h2 id=\"\u2468_\u00b7_\u5355\u6b65\u8c03\u8bd5\">\u2468 \u00b7 \u5355\u6b65\u8c03\u8bd5<\/h2>\n<p>\u81f3\u6b64\uff0c\u6211\u4f7f\u7528\u00a0<code>si<\/code>\u00a0(<code>stepi<\/code>) \u547d\u4ee4\uff0c\u8ba9\u7a0b\u5e8f\u5355\u6b65\u5730\u5411\u524d\u6267\u884c\u4e00\u6761\u6307\u4ee4\uff0c\u800c\u540e\u68c0\u67e5\u5bc4\u5b58\u5668\u72b6\u6001\u3002<\/p>\n<figure class=\"highlight bash\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span>\r\n<span class=\"line\">2<\/span>\r\n<span class=\"line\">3<\/span>\r\n<span class=\"line\">4<\/span>\r\n<span class=\"line\">5<\/span>\r\n<span class=\"line\">6<\/span>\r\n<span class=\"line\">7<\/span>\r\n<span class=\"line\">8<\/span>\r\n<span class=\"line\">9<\/span>\r\n<span class=\"line\">10<\/span>\r\n<span class=\"line\">11<\/span>\r\n<span class=\"line\">12<\/span>\r\n<span class=\"line\">13<\/span>\r\n<span class=\"line\">14<\/span>\r\n<span class=\"line\">15<\/span>\r\n<span class=\"line\">16<\/span>\r\n<span class=\"line\">17<\/span>\r\n<span class=\"line\">18<\/span>\r\n<span class=\"line\">19<\/span>\r\n<span class=\"line\">20<\/span>\r\n<span class=\"line\">21<\/span>\r\n<span class=\"line\">22<\/span>\r\n<span class=\"line\">23<\/span>\r\n<span class=\"line\">24<\/span>\r\n<span class=\"line\">25<\/span>\r\n<span class=\"line\">26<\/span>\r\n<span class=\"line\">27<\/span>\r\n<span class=\"line\">28<\/span>\r\n<span class=\"line\">29<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\">(gdb) si<\/span>\r\n<span class=\"line\"><span class=\"number\">0<\/span>x00007ffff34ad408 <span class=\"keyword\">in<\/span> doupdate () from \/lib\/x86_64-linux-gnu\/libncursesw.so.<span class=\"number\">5<\/span><\/span>\r\n<span class=\"line\">(gdb) i r<\/span>\r\n<span class=\"line\">rax            <span class=\"number\">0<\/span>x7ffff3e8f948   <span class=\"number\">140737285519688<\/span><\/span>\r\n<span class=\"line\">rbx            <span class=\"number\">0<\/span>xaea060 <span class=\"number\">11444320<\/span><\/span>\r\n<span class=\"line\">rcx            <span class=\"number\">0<\/span>xae72a0 <span class=\"number\">11432608<\/span><\/span>\r\n<span class=\"line\">rdx            <span class=\"number\">0<\/span>xa403d0 <span class=\"number\">10748880<\/span><\/span>\r\n<span class=\"line\">rsi            <span class=\"number\">0<\/span>x7ffff7ea8e10   <span class=\"number\">140737352732176<\/span><\/span>\r\n<span class=\"line\">rdi            <span class=\"number\">0<\/span>xa403d0 <span class=\"number\">10748880<\/span><\/span>\r\n<span class=\"line\">rbp            <span class=\"number\">0<\/span>x7ffff3e8fb10   <span class=\"number\">0<\/span>x7ffff3e8fb10 &lt;SP&gt;<\/span>\r\n<span class=\"line\">rsp            <span class=\"number\">0<\/span>x7fffffffd390   <span class=\"number\">0<\/span>x7fffffffd390<\/span>\r\n<span class=\"line\">r8             <span class=\"number\">0<\/span>x7ffff36ba3e0   <span class=\"number\">140737277305824<\/span><\/span>\r\n<span class=\"line\">r9             <span class=\"number\">0<\/span>x0  <span class=\"number\">0<\/span><\/span>\r\n<span class=\"line\">r10            <span class=\"number\">0<\/span>x8  <span class=\"number\">8<\/span><\/span>\r\n<span class=\"line\">r11            <span class=\"number\">0<\/span>x202    <span class=\"number\">514<\/span><\/span>\r\n<span class=\"line\">r12            <span class=\"number\">0<\/span>x0  <span class=\"number\">0<\/span><\/span>\r\n<span class=\"line\">r13            <span class=\"number\">0<\/span>x0  <span class=\"number\">0<\/span><\/span>\r\n<span class=\"line\">r14            <span class=\"number\">0<\/span>x7ffff3e8fb10   <span class=\"number\">140737285520144<\/span><\/span>\r\n<span class=\"line\">r15            <span class=\"number\">0<\/span>xa403d0 <span class=\"number\">10748880<\/span><\/span>\r\n<span class=\"line\">rip            <span class=\"number\">0<\/span>x7ffff34ad408   <span class=\"number\">0<\/span>x7ffff34ad408 &lt;doupdate+<span class=\"number\">296<\/span>&gt;<\/span>\r\n<span class=\"line\">eflags         <span class=\"number\">0<\/span>x202    [ IF ]<\/span>\r\n<span class=\"line\">cs             <span class=\"number\">0<\/span>x33 <span class=\"number\">51<\/span><\/span>\r\n<span class=\"line\">ss             <span class=\"number\">0<\/span>x2b <span class=\"number\">43<\/span><\/span>\r\n<span class=\"line\">ds             <span class=\"number\">0<\/span>x0  <span class=\"number\">0<\/span><\/span>\r\n<span class=\"line\">es             <span class=\"number\">0<\/span>x0  <span class=\"number\">0<\/span><\/span>\r\n<span class=\"line\">fs             <span class=\"number\">0<\/span>x0  <span class=\"number\">0<\/span><\/span>\r\n<span class=\"line\">gs             <span class=\"number\">0<\/span>x0  <span class=\"number\">0<\/span><\/span>\r\n<span class=\"line\">(gdb) p\/a <span class=\"number\">0<\/span>x7ffff3e8f948<\/span>\r\n<span class=\"line\"><span class=\"variable\">$1<\/span> = <span class=\"number\">0<\/span>x7ffff3e8f948 &lt;cur_term&gt;<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u65b0\u7684\u7ebf\u7d22\u51fa\u73b0\u4e86\u3002\u770b\u8d77\u6765\uff0c\u6211\u4eec\u5bf9\u7a7a\u6307\u9488\u89e3\u5f15\u7528\u7684\u64cd\u4f5c\uff0c\u53d1\u751f\u5728\u4e00\u4e2a\u540d\u4e3a\u00a0<code>cur_term<\/code>\u00a0\u7684\u7b26\u53f7\u5f53\u4e2d\u3002\uff08<code>p\/a<\/code>\u00a0\u662f\u00a0<code>print\/a<\/code>\u00a0\u7684\u7f29\u5199\uff0c\u5176\u4e2d\u00a0<code>\/a<\/code>\u00a0\u8868\u793a\u968f\u540e\u4f20\u5165\u7684\u662f\u4e00\u4e2a\u5185\u5b58\u5730\u5740\uff09\u8003\u8651\u5230\u8fd9\u662f\u5728\u8c03\u8bd5 ncurses\uff0c\u90a3\u4e48\uff0c\u662f\u4e0d\u662f\u6211\u4eec\u7684\u00a0<code>TERM<\/code>\u00a0\u73af\u5883\u8bbe\u7f6e\u6709\u95ee\u9898\u5462\uff1f<\/p>\n<figure class=\"highlight bash\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span>\r\n<span class=\"line\">2<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\"><span class=\"comment\"># echo $TERM<\/span><\/span>\r\n<span class=\"line\">xterm-<span class=\"number\">256<\/span>color<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u6211\u5c1d\u8bd5\u5c06\u5176\u8bbe\u4e3a\u00a0<code>vt100<\/code>\uff0c\u4f46\u662f\u6267\u884c\u7a0b\u5e8f\u4f9d\u65e7\u5f97\u5230\u4e86\u76f8\u540c\u7684\u6bb5\u9519\u8bef\u3002<\/p>\n<p>\u6ce8\u610f\uff0c\u6b64\u5904\u6211\u68c0\u67e5\u7684\u662f\u00a0<code>doupdate<\/code>\u00a0\u51fd\u6570\u7b2c\u4e00\u6b21\u88ab\u8c03\u7528\u7684\u60c5\u5f62\uff0c\u4f46\u5b9e\u9645\u4e0a\u5b83\u53ef\u80fd\u88ab\u591a\u6b21\u8c03\u7528\uff0c\u800c\u4e14\u95ee\u9898\u53ef\u80fd\u51fa\u5728\u540e\u7eed\u7684\u8c03\u7528\u4e2d\u3002\u4e3a\u6b64\uff0c\u6211\u4eec\u53ef\u4ee5\u8ba9\u7a0b\u5e8f\u6301\u7eed\u6267\u884c\uff08<code>c<\/code>\u00a0\u547d\u4ee4\uff09\uff0c\u76f4\u5230\u649e\u89c1\u6211\u4eec\u671f\u5f85\u7684\u90a3\u6b21\u8c03\u7528\u3002\u7136\u800c\uff0c\u8c03\u7528\u6b21\u6570\u5c11\u7684\u8bdd\uff0c\u53ef\u80fd\u8fd8\u597d\u3002\u82e5\u662f\u8c03\u7528\u591a\u6b21\uff0c\u8fd9\u5c31\u4e0d\u597d\u529e\u4e86\u3002\uff08\u7b2c 15 \u8282\u5c06\u8ba8\u8bba\u8fd9\u4e2a\u95ee\u9898\uff09<\/p>\n<h2 id=\"\u5341_\u00b7_\u5355\u6b65\u56de\u9000\">\u5341 \u00b7 \u5355\u6b65\u56de\u9000<\/h2>\n<p>\u5355\u6b65\u56de\u9000\u662f GDB \u7684\u91cd\u8981\u7279\u6027\u4e4b\u4e00\uff0cLaw \u5728\u5b83\u7684\u6f14\u8bb2\u4e2d\u4e5f\u6709\u63d0\u5230\u3002\u6211\u4eec\u770b\u4e00\u4e2a\u4f8b\u5b50\u3002<\/p>\n<p>\u6211\u4f1a\u91cd\u542f\u6574\u4e2a GDB \u4f1a\u8bdd\uff0c\u4ece\u5934\u5f00\u59cb\u6f14\u793a\u3002<\/p>\n<figure class=\"highlight bash\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span>\r\n<span class=\"line\">2<\/span>\r\n<span class=\"line\">3<\/span>\r\n<span class=\"line\">4<\/span>\r\n<span class=\"line\">5<\/span>\r\n<span class=\"line\">6<\/span>\r\n<span class=\"line\">7<\/span>\r\n<span class=\"line\">8<\/span>\r\n<span class=\"line\">9<\/span>\r\n<span class=\"line\">10<\/span>\r\n<span class=\"line\">11<\/span>\r\n<span class=\"line\">12<\/span>\r\n<span class=\"line\">13<\/span>\r\n<span class=\"line\">14<\/span>\r\n<span class=\"line\">15<\/span>\r\n<span class=\"line\">16<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\"><span class=\"comment\"># gdb `which python`<\/span><\/span>\r\n<span class=\"line\">GNU gdb (Ubuntu <span class=\"number\">7.11<\/span>.<span class=\"number\">1<\/span>-<span class=\"number\">0<\/span>ubuntu1~<span class=\"number\">16.04<\/span>) <span class=\"number\">7.11<\/span>.<span class=\"number\">1<\/span><\/span>\r\n<span class=\"line\">Copyright (C) <span class=\"number\">2016<\/span> Free Software Foundation, Inc.<\/span>\r\n<span class=\"line\">License GPLv3+: GNU GPL version <span class=\"number\">3<\/span> or later<\/span>\r\n<span class=\"line\">This is free software: you are free to change and redistribute it.<\/span>\r\n<span class=\"line\">There is NO WARRANTY, to the extent permitted by law.  Type <span class=\"string\">\"show copying\"<\/span><\/span>\r\n<span class=\"line\">and <span class=\"string\">\"show warranty\"<\/span> <span class=\"keyword\">for<\/span> details.<\/span>\r\n<span class=\"line\">This GDB was configured as <span class=\"string\">\"x86\\_64-linux-gnu\"<\/span>.<\/span>\r\n<span class=\"line\">Type <span class=\"string\">\"show configuration\"<\/span> <span class=\"keyword\">for<\/span> configuration details.<\/span>\r\n<span class=\"line\">For bug reporting instructions, please see:<\/span>\r\n<span class=\"line\">&lt;http:\/\/www.gnu.org\/software\/gdb\/bugs\/&gt;.<\/span>\r\n<span class=\"line\">Find the GDB manual and other documentation resources online at:<\/span>\r\n<span class=\"line\">&lt;http:\/\/www.gnu.org\/software\/gdb\/documentation\/&gt;.<\/span>\r\n<span class=\"line\">For <span class=\"built_in\">help<\/span>, <span class=\"built_in\">type<\/span> <span class=\"string\">\"help\"<\/span>.<\/span>\r\n<span class=\"line\">Type <span class=\"string\">\"apropos word\"<\/span> to search <span class=\"keyword\">for<\/span> commands related to <span class=\"string\">\"word\"<\/span>...<\/span>\r\n<span class=\"line\">Reading symbols from \/usr\/bin\/python...(no debugging symbols found)...done.<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u800c\u540e\uff0c\u6211\u5c06\u65ad\u70b9\u8bbe\u7f6e\u5728\u00a0<code>doupdate<\/code>\u00a0\u51fd\u6570\u4e0a\uff1b\u5f53\u9047\u5230\u4e4b\u540e\uff0c\u6211\u4f1a\u6253\u5f00\u8bb0\u5f55\u529f\u80fd\uff0c\u76f4\u5230\u8fdb\u7a0b\u5d29\u6e83\u3002\u8fd9\u79cd\u8bb0\u5f55\u529f\u80fd\uff0c\u5bf9\u7cfb\u7edf\u5f71\u54cd\u662f\u5f88\u5927\u7684\u3002\u6240\u4ee5\uff0c\u6700\u597d\u4e0d\u8981\u4ece\u00a0<code>main<\/code>\u00a0\u51fd\u6570\u5c31\u5f00\u59cb\u8bb0\u5f55\u3002<\/p>\n<figure class=\"highlight bash\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span>\r\n<span class=\"line\">2<\/span>\r\n<span class=\"line\">3<\/span>\r\n<span class=\"line\">4<\/span>\r\n<span class=\"line\">5<\/span>\r\n<span class=\"line\">6<\/span>\r\n<span class=\"line\">7<\/span>\r\n<span class=\"line\">8<\/span>\r\n<span class=\"line\">9<\/span>\r\n<span class=\"line\">10<\/span>\r\n<span class=\"line\">11<\/span>\r\n<span class=\"line\">12<\/span>\r\n<span class=\"line\">13<\/span>\r\n<span class=\"line\">14<\/span>\r\n<span class=\"line\">15<\/span>\r\n<span class=\"line\">16<\/span>\r\n<span class=\"line\">17<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\">(gdb) b doupdate<\/span>\r\n<span class=\"line\">Function <span class=\"string\">\"doupdate\"<\/span> not defined.<\/span>\r\n<span class=\"line\">Make breakpoint pending on future shared library load? (y or [n]) y<\/span>\r\n<span class=\"line\">Breakpoint <span class=\"number\">1<\/span> (doupdate) pending.<\/span>\r\n<span class=\"line\">(gdb) r cachetop.py<\/span>\r\n<span class=\"line\">Starting program: \/usr\/bin\/python cachetop.py<\/span>\r\n<span class=\"line\">[Thread debugging using libthread_db enabled]<\/span>\r\n<span class=\"line\">Using host libthread_db library <span class=\"string\">\"\/lib\/x86_64-linux-gnu\/libthread_db.so.1\"<\/span>.<\/span>\r\n<span class=\"line\">warning: JITed object file architecture unknown is not compatible with target architecture i386:x86-<span class=\"number\">64<\/span>.<\/span>\r\n\r\n<span class=\"line\">Breakpoint <span class=\"number\">1<\/span>, <span class=\"number\">0<\/span>x00007ffff34ad2e0 <span class=\"keyword\">in<\/span> doupdate () from \/lib\/x86_64-linux-gnu\/libncursesw.so.<span class=\"number\">5<\/span><\/span>\r\n<span class=\"line\">(gdb) record<\/span>\r\n<span class=\"line\">(gdb) c<\/span>\r\n<span class=\"line\">Continuing.<\/span>\r\n\r\n<span class=\"line\">Program received signal SIGSEGV, Segmentation fault.<\/span>\r\n<span class=\"line\"><span class=\"number\">0<\/span>x00007ffff34ad40d <span class=\"keyword\">in<\/span> doupdate () from \/lib\/x86_64-linux-gnu\/libncursesw.so.<span class=\"number\">5<\/span><\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u81f3\u6b64\uff0c\u6211\u5c31\u53ef\u4ee5\u5728\u4ee3\u7801\u884c\u6216\u8005\u6307\u4ee4\u7684\u610f\u4e49\u4e0a\u5355\u6b65\u56de\u9000\u4e86\u3002\u5355\u6b65\u56de\u9000\u7684\u539f\u7406\uff0c\u662f\u4ece\u8bb0\u5f55\u4e2d\uff0c\u56de\u653e\u5bc4\u5b58\u5668\u7684\u72b6\u6001\u3002\u6b64\u5904\uff0c\u6211\u56de\u9000\u4e24\u4e2a\u6307\u4ee4\uff0c\u800c\u540e\u6253\u5370\u5bc4\u5b58\u5668\u72b6\u6001\u3002<\/p>\n<figure class=\"highlight bash\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span>\r\n<span class=\"line\">2<\/span>\r\n<span class=\"line\">3<\/span>\r\n<span class=\"line\">4<\/span>\r\n<span class=\"line\">5<\/span>\r\n<span class=\"line\">6<\/span>\r\n<span class=\"line\">7<\/span>\r\n<span class=\"line\">8<\/span>\r\n<span class=\"line\">9<\/span>\r\n<span class=\"line\">10<\/span>\r\n<span class=\"line\">11<\/span>\r\n<span class=\"line\">12<\/span>\r\n<span class=\"line\">13<\/span>\r\n<span class=\"line\">14<\/span>\r\n<span class=\"line\">15<\/span>\r\n<span class=\"line\">16<\/span>\r\n<span class=\"line\">17<\/span>\r\n<span class=\"line\">18<\/span>\r\n<span class=\"line\">19<\/span>\r\n<span class=\"line\">20<\/span>\r\n<span class=\"line\">21<\/span>\r\n<span class=\"line\">22<\/span>\r\n<span class=\"line\">23<\/span>\r\n<span class=\"line\">24<\/span>\r\n<span class=\"line\">25<\/span>\r\n<span class=\"line\">26<\/span>\r\n<span class=\"line\">27<\/span>\r\n<span class=\"line\">28<\/span>\r\n<span class=\"line\">29<\/span>\r\n<span class=\"line\">30<\/span>\r\n<span class=\"line\">31<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\">(gdb) reverse-stepi<\/span>\r\n<span class=\"line\"><span class=\"number\">0<\/span>x00007ffff34ad40d <span class=\"keyword\">in<\/span> doupdate () from \/lib\/x86_64-linux-gnu\/libncursesw.so.<span class=\"number\">5<\/span><\/span>\r\n<span class=\"line\">(gdb) reverse-stepi<\/span>\r\n<span class=\"line\"><span class=\"number\">0<\/span>x00007ffff34ad40b <span class=\"keyword\">in<\/span> doupdate () from \/lib\/x86_64-linux-gnu\/libncursesw.so.<span class=\"number\">5<\/span><\/span>\r\n<span class=\"line\">(gdb) i r<\/span>\r\n<span class=\"line\">rax            <span class=\"number\">0<\/span>x7ffff3e8f948   <span class=\"number\">140737285519688<\/span><\/span>\r\n<span class=\"line\">rbx            <span class=\"number\">0<\/span>xaea060 <span class=\"number\">11444320<\/span><\/span>\r\n<span class=\"line\">rcx            <span class=\"number\">0<\/span>xae72a0 <span class=\"number\">11432608<\/span><\/span>\r\n<span class=\"line\">rdx            <span class=\"number\">0<\/span>xa403d0 <span class=\"number\">10748880<\/span><\/span>\r\n<span class=\"line\">rsi            <span class=\"number\">0<\/span>x0  <span class=\"number\">0<\/span><\/span>\r\n<span class=\"line\">rdi            <span class=\"number\">0<\/span>xa403d0 <span class=\"number\">10748880<\/span><\/span>\r\n<span class=\"line\">rbp            <span class=\"number\">0<\/span>x7ffff3e8fb10   <span class=\"number\">0<\/span>x7ffff3e8fb10 &lt;SP&gt;<\/span>\r\n<span class=\"line\">rsp            <span class=\"number\">0<\/span>x7fffffffd390   <span class=\"number\">0<\/span>x7fffffffd390<\/span>\r\n<span class=\"line\">r8             <span class=\"number\">0<\/span>x7ffff36ba3e0   <span class=\"number\">140737277305824<\/span><\/span>\r\n<span class=\"line\">r9             <span class=\"number\">0<\/span>x0  <span class=\"number\">0<\/span><\/span>\r\n<span class=\"line\">r10            <span class=\"number\">0<\/span>x8  <span class=\"number\">8<\/span><\/span>\r\n<span class=\"line\">r11            <span class=\"number\">0<\/span>x302    <span class=\"number\">770<\/span><\/span>\r\n<span class=\"line\">r12            <span class=\"number\">0<\/span>x0  <span class=\"number\">0<\/span><\/span>\r\n<span class=\"line\">r13            <span class=\"number\">0<\/span>x0  <span class=\"number\">0<\/span><\/span>\r\n<span class=\"line\">r14            <span class=\"number\">0<\/span>x7ffff3e8fb10   <span class=\"number\">140737285520144<\/span><\/span>\r\n<span class=\"line\">r15            <span class=\"number\">0<\/span>xa403d0 <span class=\"number\">10748880<\/span><\/span>\r\n<span class=\"line\">rip            <span class=\"number\">0<\/span>x7ffff34ad40b   <span class=\"number\">0<\/span>x7ffff34ad40b &lt;doupdate+<span class=\"number\">299<\/span>&gt;<\/span>\r\n<span class=\"line\">eflags         <span class=\"number\">0<\/span>x202    [ IF ]<\/span>\r\n<span class=\"line\">cs             <span class=\"number\">0<\/span>x33 <span class=\"number\">51<\/span><\/span>\r\n<span class=\"line\">ss             <span class=\"number\">0<\/span>x2b <span class=\"number\">43<\/span><\/span>\r\n<span class=\"line\">ds             <span class=\"number\">0<\/span>x0  <span class=\"number\">0<\/span><\/span>\r\n<span class=\"line\">es             <span class=\"number\">0<\/span>x0  <span class=\"number\">0<\/span><\/span>\r\n<span class=\"line\">fs             <span class=\"number\">0<\/span>x0  <span class=\"number\">0<\/span><\/span>\r\n<span class=\"line\">gs             <span class=\"number\">0<\/span>x0  <span class=\"number\">0<\/span><\/span>\r\n<span class=\"line\">(gdb) p\/a <span class=\"number\">0<\/span>x7ffff3e8f948<\/span>\r\n<span class=\"line\"><span class=\"variable\">$1<\/span> = <span class=\"number\">0<\/span>x7ffff3e8f948 &lt;cur_term&gt;<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u8fd9\u6b21\u786e\u5b9a\u65e0\u7591\uff0c\u6211\u4eec\u53c8\u4e00\u6b21\u5b9a\u4f4d\u5230\u4e86\u00a0<code>cur_term<\/code>\u00a0\u8fd9\u6761\u7ebf\u7d22\u3002\u6b64\u65f6\uff0c\u6211\u5f88\u60f3\u8bfb\u8bfb\u6e90\u7801\uff0c\u4f46\u662f\u9996\u5148\u6211\u4f1a\u8bd5\u7740\u770b\u5230\u66f4\u591a\u7684\u8c03\u8bd5\u4fe1\u606f\u3002<\/p>\n<h2 id=\"\u5341\u4e00_\u00b7_\u8c03\u8bd5\u4fe1\u606f\">\u5341\u4e00 \u00b7 \u8c03\u8bd5\u4fe1\u606f<\/h2>\n<p>\u8fd9\u91cc\uff0c\u6211\u4eec\u9700\u8981\uff08\u5728 Ubuntu \u4e0a\uff09\u5b89\u88c5\u00a0<code>libncursesw<\/code>\u00a0\u7684\u8c03\u8bd5\u4fe1\u606f\u5305\u3002<\/p>\n<figure class=\"highlight bash\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span>\r\n<span class=\"line\">2<\/span>\r\n<span class=\"line\">3<\/span>\r\n<span class=\"line\">4<\/span>\r\n<span class=\"line\">5<\/span>\r\n<span class=\"line\">6<\/span>\r\n<span class=\"line\">7<\/span>\r\n<span class=\"line\">8<\/span>\r\n<span class=\"line\">9<\/span>\r\n<span class=\"line\">10<\/span>\r\n<span class=\"line\">11<\/span>\r\n<span class=\"line\">12<\/span>\r\n<span class=\"line\">13<\/span>\r\n<span class=\"line\">14<\/span>\r\n<span class=\"line\">15<\/span>\r\n<span class=\"line\">16<\/span>\r\n<span class=\"line\">17<\/span>\r\n<span class=\"line\">18<\/span>\r\n<span class=\"line\">19<\/span>\r\n<span class=\"line\">20<\/span>\r\n<span class=\"line\">21<\/span>\r\n<span class=\"line\">22<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\"><span class=\"comment\"># apt-cache search libncursesw<\/span><\/span>\r\n<span class=\"line\">libncursesw5 - shared libraries <span class=\"keyword\">for<\/span> terminal handling (wide character support)<\/span>\r\n<span class=\"line\">libncursesw5-dbg - debugging\/profiling libraries <span class=\"keyword\">for<\/span> ncursesw<\/span>\r\n<span class=\"line\">libncursesw5-dev - developer<span class=\"string\">'s libraries for ncursesw<\/span>\r\n# dpkg -l | grep libncursesw\r\nii  libncursesw5:amd64                  6.0+20160213-1ubuntu1                    amd64        shared libraries for terminal handling (wide character support)\r\n# apt-get install -y libncursesw5-dbg\r\nReading package lists... Done\r\nBuilding dependency tree\r\nReading state information... Done\r\n[...]\r\nAfter this operation, 2,488 kB of additional disk space will be used.\r\nGet:1 http:\/\/us-west-1.ec2.archive.ubuntu.com\/ubuntu xenial\/main amd64 libncursesw5-dbg amd64 6.0+20160213-1ubuntu1 [729 kB]\r\nFetched 729 kB in 0s (865 kB\/s)\r\nSelecting previously unselected package libncursesw5-dbg.\r\n(Reading database ... 200094 files and directories currently installed.)\r\nPreparing to unpack ...\/libncursesw5-dbg_6.0+20160213-1ubuntu1_amd64.deb ...\r\nUnpacking libncursesw5-dbg (6.0+20160213-1ubuntu1) ...\r\nSetting up libncursesw5-dbg (6.0+20160213-1ubuntu1) ...\r\n# dpkg -l | grep libncursesw\r\nii  libncursesw5:amd64                  6.0+20160213-1ubuntu1                    amd64        shared libraries for terminal handling (wide character support)\r\nii  libncursesw5-dbg                    6.0+20160213-1ubuntu1                    amd64        debugging\/profiling libraries for ncursesw<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u8d5e~\uff01\u6b64\u5904\u7684\u8c03\u8bd5\u4fe1\u606f\u5305\u4e0e\u52a8\u6001\u5e93\u7684\u7248\u672c\u662f\u4e00\u81f4\u7684\u3002\u73b0\u5728\u7684\u6bb5\u9519\u8bef\u770b\u8d77\u6765\u662f\u600e\u6837\u7684\u5462\uff1f<\/p>\n<figure class=\"highlight bash\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span>\r\n<span class=\"line\">2<\/span>\r\n<span class=\"line\">3<\/span>\r\n<span class=\"line\">4<\/span>\r\n<span class=\"line\">5<\/span>\r\n<span class=\"line\">6<\/span>\r\n<span class=\"line\">7<\/span>\r\n<span class=\"line\">8<\/span>\r\n<span class=\"line\">9<\/span>\r\n<span class=\"line\">10<\/span>\r\n<span class=\"line\">11<\/span>\r\n<span class=\"line\">12<\/span>\r\n<span class=\"line\">13<\/span>\r\n<span class=\"line\">14<\/span>\r\n<span class=\"line\">15<\/span>\r\n<span class=\"line\">16<\/span>\r\n<span class=\"line\">17<\/span>\r\n<span class=\"line\">18<\/span>\r\n<span class=\"line\">19<\/span>\r\n<span class=\"line\">20<\/span>\r\n<span class=\"line\">21<\/span>\r\n<span class=\"line\">22<\/span>\r\n<span class=\"line\">23<\/span>\r\n<span class=\"line\">24<\/span>\r\n<span class=\"line\">25<\/span>\r\n<span class=\"line\">26<\/span>\r\n<span class=\"line\">27<\/span>\r\n<span class=\"line\">28<\/span>\r\n<span class=\"line\">29<\/span>\r\n<span class=\"line\">30<\/span>\r\n<span class=\"line\">31<\/span>\r\n<span class=\"line\">32<\/span>\r\n<span class=\"line\">33<\/span>\r\n<span class=\"line\">34<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\"><span class=\"comment\"># gdb `which python` \/var\/cores\/core.python.30520<\/span><\/span>\r\n<span class=\"line\">GNU gdb (Ubuntu <span class=\"number\">7.11<\/span>.<span class=\"number\">1<\/span>-<span class=\"number\">0<\/span>ubuntu1~<span class=\"number\">16.04<\/span>) <span class=\"number\">7.11<\/span>.<span class=\"number\">1<\/span><\/span>\r\n<span class=\"line\">[...]<\/span>\r\n<span class=\"line\">warning: JITed object file architecture unknown is not compatible with target architecture i386:x86-<span class=\"number\">64<\/span>.<\/span>\r\n<span class=\"line\">Core was generated by `python .\/cachetop.py<span class=\"string\">'.<\/span>\r\nProgram terminated with signal SIGSEGV, Segmentation fault.\r\n#0  ClrBlank (win=0x1993060) at \/build\/ncurses-pKZ1BN\/ncurses-6.0+20160213\/ncurses\/tty\/tty_update.c:1129\r\n1129        if (back_color_erase)\r\n(gdb) bt\r\n#0  ClrBlank (win=0x1993060) at \/build\/ncurses-pKZ1BN\/ncurses-6.0+20160213\/ncurses\/tty\/tty_update.c:1129\r\n#1  ClrUpdate () at \/build\/ncurses-pKZ1BN\/ncurses-6.0+20160213\/ncurses\/tty\/tty_update.c:1147\r\n#2  doupdate () at \/build\/ncurses-pKZ1BN\/ncurses-6.0+20160213\/ncurses\/tty\/tty_update.c:1010\r\n#3  0x00007f0a37aa07e6 in wrefresh (win=win@entry=0x1993060) at \/build\/ncurses-pKZ1BN\/ncurses-6.0+20160213\/ncurses\/base\/lib_refresh.c:65\r\n#4  0x00007f0a37a99499 in recur_wrefresh (win=win@entry=0x1993060) at \/build\/ncurses-pKZ1BN\/ncurses-6.0+20160213\/ncurses\/base\/lib_getch.c:384\r\n#5  0x00007f0a37a99616 in _nc_wgetch (win=win@entry=0x1993060, result=result@entry=0x7ffd33d93e24, use_meta=1)\r\n    at \/build\/ncurses-pKZ1BN\/ncurses-6.0+20160213\/ncurses\/base\/lib_getch.c:491\r\n#6  0x00007f0a37a9a325 in wgetch (win=0x1993060) at \/build\/ncurses-pKZ1BN\/ncurses-6.0+20160213\/ncurses\/base\/lib_getch.c:672\r\n#7  0x00007f0a37cc6ec3 in ?? () from \/usr\/lib\/python2.7\/lib-dynload\/_curses.x86_64-linux-gnu.so\r\n#8  0x00000000004c4d5a in PyEval_EvalFrameEx ()\r\n#9  0x00000000004c2e05 in PyEval_EvalCodeEx ()\r\n#10 0x00000000004def08 in ?? ()\r\n#11 0x00000000004b1153 in PyObject_Call ()\r\n#12 0x00000000004c73ec in PyEval_EvalFrameEx ()\r\n#13 0x00000000004c2e05 in PyEval_EvalCodeEx ()\r\n#14 0x00000000004caf42 in PyEval_EvalFrameEx ()\r\n#15 0x00000000004c2e05 in PyEval_EvalCodeEx ()\r\n#16 0x00000000004c2ba9 in PyEval_EvalCode ()\r\n#17 0x00000000004f20ef in ?? ()\r\n#18 0x00000000004eca72 in PyRun_FileExFlags ()\r\n#19 0x00000000004eb1f1 in PyRun_SimpleFileExFlags ()\r\n#20 0x000000000049e18a in Py_Main ()\r\n#21 0x00007f0a3be10830 in __libc_start_main (main=0x49daf0 &lt;main&gt;, argc=2, argv=0x7ffd33d94838, init=&lt;optimized out&gt;, fini=&lt;optimized out&gt;, rtld_fini=&lt;optimized out&gt;,\r\n    stack_end=0x7ffd33d94828) at ..\/csu\/libc-start.c:291\r\n#22 0x000000000049da19 in _start ()<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u8c03\u7528\u6808\u770b\u8d77\u6765\u7a0d\u5fae\u6709\u4e9b\u4e0d\u4e00\u6837\u4e86\u3002\u53d1\u751f\u6bb5\u9519\u8bef\u7684\u5730\u65b9\uff0c\u5b9e\u9645\u662f\u5728\u00a0<code>ClrBlank()<\/code>\u00a0\u51fd\u6570\u5f53\u4e2d\u3002\u5b83\u9996\u5148\u88ab\u5185\u8054\u5230\u00a0<code>ClrUpdate()<\/code>\u00a0\u5f53\u4e2d\uff0c\u6700\u540e\u5185\u8054\u5230\u00a0<code>doupdate()<\/code>\u00a0\u5f53\u4e2d\u3002<\/p>\n<p>\u81f3\u6b64\uff0c\u6211\u771f\u7684\u8981\u8bfb\u8bfb\u4ee3\u7801\u4e86\u3002<\/p>\n<h2 id=\"\u5341\u4e8c_\u00b7_\u6e90\u4ee3\u7801\">\u5341\u4e8c \u00b7 \u6e90\u4ee3\u7801<\/h2>\n<p>\u6709\u4e86\u8c03\u8bd5\u4fe1\u606f\u5305\uff0cGDB \u53ef\u4ee5\u5c06\u6e90\u4ee3\u7801\u548c\u6c47\u7f16\u7801\u6253\u5370\u5728\u4e00\u8d77\u3002<\/p>\n<figure class=\"highlight bash\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span>\r\n<span class=\"line\">2<\/span>\r\n<span class=\"line\">3<\/span>\r\n<span class=\"line\">4<\/span>\r\n<span class=\"line\">5<\/span>\r\n<span class=\"line\">6<\/span>\r\n<span class=\"line\">7<\/span>\r\n<span class=\"line\">8<\/span>\r\n<span class=\"line\">9<\/span>\r\n<span class=\"line\">10<\/span>\r\n<span class=\"line\">11<\/span>\r\n<span class=\"line\">12<\/span>\r\n<span class=\"line\">13<\/span>\r\n<span class=\"line\">14<\/span>\r\n<span class=\"line\">15<\/span>\r\n<span class=\"line\">16<\/span>\r\n<span class=\"line\">17<\/span>\r\n<span class=\"line\">18<\/span>\r\n<span class=\"line\">19<\/span>\r\n<span class=\"line\">20<\/span>\r\n<span class=\"line\">21<\/span>\r\n<span class=\"line\">22<\/span>\r\n<span class=\"line\">23<\/span>\r\n<span class=\"line\">24<\/span>\r\n<span class=\"line\">25<\/span>\r\n<span class=\"line\">26<\/span>\r\n<span class=\"line\">27<\/span>\r\n<span class=\"line\">28<\/span>\r\n<span class=\"line\">29<\/span>\r\n<span class=\"line\">30<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\">(gdb) disas\/s<\/span>\r\n<span class=\"line\">Dump of assembler code <span class=\"keyword\">for<\/span> <span class=\"keyword\">function<\/span> doupdate:<\/span>\r\n<span class=\"line\">\/build\/ncurses-pKZ1BN\/ncurses-<span class=\"number\">6.0<\/span>+<span class=\"number\">20160213<\/span>\/ncurses\/tty\/tty_update.c:<\/span>\r\n<span class=\"line\"><span class=\"number\">759<\/span> {<\/span>\r\n<span class=\"line\">   <span class=\"number\">0<\/span>x00007f0a37aac2e0 &lt;+<span class=\"number\">0<\/span>&gt;:   push   %r15<\/span>\r\n<span class=\"line\">   <span class=\"number\">0<\/span>x00007f0a37aac2e2 &lt;+<span class=\"number\">2<\/span>&gt;:   push   %r14<\/span>\r\n<span class=\"line\">   <span class=\"number\">0<\/span>x00007f0a37aac2e4 &lt;+<span class=\"number\">4<\/span>&gt;:   push   %r13<\/span>\r\n<span class=\"line\">   <span class=\"number\">0<\/span>x00007f0a37aac2e6 &lt;+<span class=\"number\">6<\/span>&gt;:   push   %r12<\/span>\r\n<span class=\"line\">[...]<\/span>\r\n<span class=\"line\">   <span class=\"number\">0<\/span>x00007f0a37aac3dd &lt;+<span class=\"number\">253<\/span>&gt;: jne    <span class=\"number\">0<\/span>x7f0a37aac6ca &lt;doupdate+<span class=\"number\">1002<\/span>&gt;<\/span>\r\n\r\n<span class=\"line\"><span class=\"number\">1009<\/span>        <span class=\"keyword\">if<\/span> (CurScreen(SP_PARM)-&gt;_clear || NewScreen(SP_PARM)-&gt;_clear) {   \/* force refresh ? *\/<\/span>\r\n<span class=\"line\">   <span class=\"number\">0<\/span>x00007f0a37aac3e3 &lt;+<span class=\"number\">259<\/span>&gt;: mov    <span class=\"number\">0<\/span>x80(%rdx),%rax<\/span>\r\n<span class=\"line\">   <span class=\"number\">0<\/span>x00007f0a37aac3ea &lt;+<span class=\"number\">266<\/span>&gt;: mov    <span class=\"number\">0<\/span>x88(%rdx),%rcx<\/span>\r\n<span class=\"line\">   <span class=\"number\">0<\/span>x00007f0a37aac3f1 &lt;+<span class=\"number\">273<\/span>&gt;: cmpb   <span class=\"variable\">$0x0<\/span>,<span class=\"number\">0<\/span>x21(%rax)<\/span>\r\n<span class=\"line\">   <span class=\"number\">0<\/span>x00007f0a37aac3f5 &lt;+<span class=\"number\">277<\/span>&gt;: jne    <span class=\"number\">0<\/span>x7f0a37aac401 &lt;doupdate+<span class=\"number\">289<\/span>&gt;<\/span>\r\n<span class=\"line\">   <span class=\"number\">0<\/span>x00007f0a37aac3f7 &lt;+<span class=\"number\">279<\/span>&gt;: cmpb   <span class=\"variable\">$0x0<\/span>,<span class=\"number\">0<\/span>x21(%rcx)<\/span>\r\n<span class=\"line\">   <span class=\"number\">0<\/span>x00007f0a37aac3fb &lt;+<span class=\"number\">283<\/span>&gt;: je     <span class=\"number\">0<\/span>x7f0a37aacc3b &lt;doupdate+<span class=\"number\">2395<\/span>&gt;<\/span>\r\n\r\n<span class=\"line\"><span class=\"number\">1129<\/span>        <span class=\"keyword\">if<\/span> (back_color_erase)<\/span>\r\n<span class=\"line\">   <span class=\"number\">0<\/span>x00007f0a37aac401 &lt;+<span class=\"number\">289<\/span>&gt;: mov    <span class=\"number\">0<\/span>x20cb68(%rip),%rax        <span class=\"comment\"># 0x7f0a37cb8f70<\/span><\/span>\r\n<span class=\"line\">   <span class=\"number\">0<\/span>x00007f0a37aac408 &lt;+<span class=\"number\">296<\/span>&gt;: mov    (%rax),%rsi<\/span>\r\n\r\n<span class=\"line\"><span class=\"number\">1128<\/span>        NCURSES_CH_T blank = blankchar;<\/span>\r\n<span class=\"line\">   <span class=\"number\">0<\/span>x00007f0a37aac40b &lt;+<span class=\"number\">299<\/span>&gt;: xor    %eax,%eax<\/span>\r\n\r\n<span class=\"line\"><span class=\"number\">1129<\/span>        <span class=\"keyword\">if<\/span> (back_color_erase)<\/span>\r\n<span class=\"line\">=&gt; <span class=\"number\">0<\/span>x00007f0a37aac40d &lt;+<span class=\"number\">301<\/span>&gt;: mov    <span class=\"number\">0<\/span>x10(%rsi),%rdi<\/span>\r\n<span class=\"line\">   <span class=\"number\">0<\/span>x00007f0a37aac411 &lt;+<span class=\"number\">305<\/span>&gt;: cmpb   <span class=\"variable\">$0x0<\/span>,<span class=\"number\">0<\/span>x1c(%rdi)<\/span>\r\n<span class=\"line\">   <span class=\"number\">0<\/span>x00007f0a37aac415 &lt;+<span class=\"number\">309<\/span>&gt;: jne    <span class=\"number\">0<\/span>x7f0a37aac6f7 &lt;doupdate+<span class=\"number\">1047<\/span>&gt;<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u597d\uff0c\u4f9d\u65e7\u6709\u00a0<code>=&gt;<\/code>\u00a0\u4f5c\u4e3a\u51fa\u95ee\u9898\u6307\u4ee4\u7684\u6807\u8bb0\uff0c\u4ee5\u53ca\u6307\u4ee4\u5bf9\u5e94\u7684\u4ee3\u7801\u6253\u5370\u5728\u5176\u4e0a\u3002\u90a3\u4e48\uff0c\u7a0b\u5e8f\u4ea7\u751f\u6bb5\u9519\u8bef\uff0c\u662f\u56e0\u4e3a\u00a0<code>if(back_color_erase)<\/code>\u00a0\u8fd9\u4e00\u884c\u4ee3\u7801\u5417\uff1f\u770b\u8d77\u6765\u4f3c\u4e4e\u4e0d\u592a\u53ef\u80fd\u3002\u6bb5\u9519\u8bef\u4ea7\u751f\u7684\u539f\u56e0\u662f\u5bf9\u6307\u5411\u975e\u6cd5\u5730\u5740\u7684\u6307\u9488\u8fdb\u884c\u89e3\u5f15\u7528\uff0c\u4f8b\u5982\u00a0<code>a-&gt;b<\/code>\u00a0\u6216\u8005\u00a0<code>*a<\/code>\u3002\u4f46\u5728\u6b64\u5904\uff0c<code>back_color_erase<\/code>\u00a0\u4ec5\u53ea\u662f\u666e\u901a\u5730\u8bbf\u95ee\u53d8\u91cf\uff0c\u6ca1\u6709\u89e3\u5f15\u7528\u7684\u52a8\u4f5c\uff0c\u662f\u4e0d\u4f1a\u5f15\u8d77\u6bb5\u9519\u8bef\u7684\u3002<\/p>\n<p>\u4e3a\u6b64\uff0c\u6211\u53cd\u590d\u68c0\u67e5\u4e86\u8c03\u8bd5\u4fe1\u606f\u5305\u7684\u7248\u672c\u662f\u5426\u5339\u914d\uff0c\u800c\u540e\u91cd\u65b0\u5728 GDB \u91cc\u6267\u884c\u7a0b\u5e8f\uff0c\u4f46\u65e0\u6709\u6536\u83b7\u2014\u2014\u6bb5\u9519\u8bef\u53d1\u751f\u5728\u540c\u4e00\u4f4d\u7f6e\u3002<\/p>\n<p>\u90a3\u4e48\uff0c\u662f\u4e0d\u662f\u00a0<code>back_color_erase<\/code>\u00a0\u672c\u8eab\u6709\u4ec0\u4e48\u7279\u522b\u4e4b\u5904\u5462\uff1f\u73b0\u5728\u6211\u4eec\u5728\u00a0<code>ClrBlank<\/code>\u00a0\u51fd\u6570\u4e2d\uff0c\u6211\u8bd5\u7740\u5217\u51fa\u5b83\u7684\u6e90\u4ee3\u7801\u3002<\/p>\n<figure class=\"highlight bash\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span>\r\n<span class=\"line\">2<\/span>\r\n<span class=\"line\">3<\/span>\r\n<span class=\"line\">4<\/span>\r\n<span class=\"line\">5<\/span>\r\n<span class=\"line\">6<\/span>\r\n<span class=\"line\">7<\/span>\r\n<span class=\"line\">8<\/span>\r\n<span class=\"line\">9<\/span>\r\n<span class=\"line\">10<\/span>\r\n<span class=\"line\">11<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\">(gdb) list ClrBlank<\/span>\r\n<span class=\"line\"><span class=\"number\">1124<\/span><\/span>\r\n<span class=\"line\"><span class=\"number\">1125<\/span>    static NCURSES_INLINE NCURSES_CH_T<\/span>\r\n<span class=\"line\"><span class=\"number\">1126<\/span>    ClrBlank(NCURSES_SP_DCLx WINDOW *win)<\/span>\r\n<span class=\"line\"><span class=\"number\">1127<\/span>    {<\/span>\r\n<span class=\"line\"><span class=\"number\">1128<\/span>        NCURSES_CH_T blank = blankchar;<\/span>\r\n<span class=\"line\"><span class=\"number\">1129<\/span>        <span class=\"keyword\">if<\/span> (back_color_erase)<\/span>\r\n<span class=\"line\"><span class=\"number\">1130<\/span>        AddAttr(blank, (AttrOf(BCE_BKGD(SP_PARM, win)) &amp; BCE_ATTRS));<\/span>\r\n<span class=\"line\"><span class=\"number\">1131<\/span>        <span class=\"built_in\">return<\/span> blank;<\/span>\r\n<span class=\"line\"><span class=\"number\">1132<\/span>    }<\/span>\r\n<span class=\"line\"><span class=\"number\">1133<\/span><\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u5443\u2026\u2026<code>back_color_erase<\/code>\u00a0\u5728\u51fd\u6570\u91cc\u662f\u672a\u5b9a\u4e49\u7684\uff0c\u770b\u8d77\u6765\u662f\u4e00\u4e2a\u5168\u5c40\u53d8\u91cf\uff1f<\/p>\n<h2 id=\"\u5341\u4e09_\u00b7_TUI\">\u5341\u4e09 \u00b7 TUI<\/h2>\n<p>TUI \u662f text user interface\uff08\u6587\u672c\u7528\u6237\u754c\u9762\uff09\u7684\u7f29\u5199\u3002\u8fd9\u4e00\u754c\u9762\u6211\u751a\u5c11\u4f7f\u7528\uff0c\u6211\u4e5f\u662f\u542c\u8fc7 Law \u7684\u8bb2\u5ea7\u4e4b\u540e\u53d7\u5230\u7684\u542f\u53d1\u3002<\/p>\n<p>\u4e3a\u6b64\uff0c\u4f60\u9700\u8981\u5728 GDB \u542f\u52a8\u7684\u65f6\u5019\uff0c\u4f20\u5165\u00a0<code>--tui<\/code>\u00a0\u53c2\u6570\u3002<\/p>\n<figure class=\"highlight bash\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span>\r\n<span class=\"line\">2<\/span>\r\n<span class=\"line\">3<\/span>\r\n<span class=\"line\">4<\/span>\r\n<span class=\"line\">5<\/span>\r\n<span class=\"line\">6<\/span>\r\n<span class=\"line\">7<\/span>\r\n<span class=\"line\">8<\/span>\r\n<span class=\"line\">9<\/span>\r\n<span class=\"line\">10<\/span>\r\n<span class=\"line\">11<\/span>\r\n<span class=\"line\">12<\/span>\r\n<span class=\"line\">13<\/span>\r\n<span class=\"line\">14<\/span>\r\n<span class=\"line\">15<\/span>\r\n<span class=\"line\">16<\/span>\r\n<span class=\"line\">17<\/span>\r\n<span class=\"line\">18<\/span>\r\n<span class=\"line\">19<\/span>\r\n<span class=\"line\">20<\/span>\r\n<span class=\"line\">21<\/span>\r\n<span class=\"line\">22<\/span>\r\n<span class=\"line\">23<\/span>\r\n<span class=\"line\">24<\/span>\r\n<span class=\"line\">25<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\"><span class=\"comment\"># gdb --tui `which python` \/var\/cores\/core.python.30520<\/span><\/span>\r\n<span class=\"line\">   \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<\/span>\r\n<span class=\"line\">   \u2502                                                                           \u2502<\/span>\r\n<span class=\"line\">   \u2502                                                                           \u2502<\/span>\r\n<span class=\"line\">   \u2502                                                                           \u2502<\/span>\r\n<span class=\"line\">   \u2502                                                                           \u2502<\/span>\r\n<span class=\"line\">   \u2502                                                                           \u2502<\/span>\r\n<span class=\"line\">   \u2502                                                                           \u2502<\/span>\r\n<span class=\"line\">   \u2502             [ No Source Available ]                                       \u2502<\/span>\r\n<span class=\"line\">   \u2502                                                                           \u2502<\/span>\r\n<span class=\"line\">   \u2502                                                                           \u2502<\/span>\r\n<span class=\"line\">   \u2502                                                                           \u2502<\/span>\r\n<span class=\"line\">   \u2502                                                                           \u2502<\/span>\r\n<span class=\"line\">   \u2502                                                                           \u2502<\/span>\r\n<span class=\"line\">   \u2502                                                                           \u2502<\/span>\r\n<span class=\"line\">   \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/span>\r\n<span class=\"line\">None No process In:                                                L??   PC: ??<\/span>\r\n<span class=\"line\">GNU gdb (Ubuntu <span class=\"number\">7.11<\/span>.<span class=\"number\">1<\/span>-<span class=\"number\">0<\/span>ubuntu1~<span class=\"number\">16.04<\/span>) <span class=\"number\">7.11<\/span>.<span class=\"number\">1<\/span><\/span>\r\n<span class=\"line\">Copyright (C) <span class=\"number\">2016<\/span> Free Software Foundation, Inc.<\/span>\r\n<span class=\"line\">License GPLv3+: GNU GPL version <span class=\"number\">3<\/span> or later<\/span>\r\n<span class=\"line\">This is free software: you are free to change and redistribute it.<\/span>\r\n<span class=\"line\">There is NO WARRANTY, to the extent permitted by law.  Type <span class=\"string\">\"show copying\"<\/span><\/span>\r\n<span class=\"line\">and <span class=\"string\">\"show warranty\"<\/span> <span class=\"keyword\">for<\/span> details.<\/span>\r\n<span class=\"line\">This GDB was configured as <span class=\"string\">\"x86_64-linux-gnu\"<\/span>.<\/span>\r\n<span class=\"line\">---Type  to <span class=\"built_in\">continue<\/span>, or q  to quit---<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>GDB \u62b1\u6028\u8bf4\u6ca1\u80fd\u627e\u5230 Python \u7684\u6e90\u4ee3\u7801\u3002\u8bda\u7136\uff0c\u6211\u53ef\u4ee5\u53bb\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\uff0c\u7136\u800c\uff0c\u73b0\u5728\u8fdb\u7a0b\u5d29\u6e83\u7684\u4f4d\u7f6e\u662f\u5728\u00a0<code>libncursesw<\/code>\uff0c\u8d39\u52b2\u53bb\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u5c31\u6ca1\u5fc5\u8981\u4e86\u3002\u56e0\u6b64\uff0c\u6309\u4e0b\u56de\u8f66\uff0c\u4f7f\u5176\u7ee7\u7eed\u52a0\u8f7d\uff0c\u5e76\u8bfb\u5165\u00a0<code>libncursesw<\/code>\u00a0\u7684\u8c03\u8bd5\u4fe1\u606f\u3002<\/p>\n<figure class=\"highlight bash\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span>\r\n<span class=\"line\">2<\/span>\r\n<span class=\"line\">3<\/span>\r\n<span class=\"line\">4<\/span>\r\n<span class=\"line\">5<\/span>\r\n<span class=\"line\">6<\/span>\r\n<span class=\"line\">7<\/span>\r\n<span class=\"line\">8<\/span>\r\n<span class=\"line\">9<\/span>\r\n<span class=\"line\">10<\/span>\r\n<span class=\"line\">11<\/span>\r\n<span class=\"line\">12<\/span>\r\n<span class=\"line\">13<\/span>\r\n<span class=\"line\">14<\/span>\r\n<span class=\"line\">15<\/span>\r\n<span class=\"line\">16<\/span>\r\n<span class=\"line\">17<\/span>\r\n<span class=\"line\">18<\/span>\r\n<span class=\"line\">19<\/span>\r\n<span class=\"line\">20<\/span>\r\n<span class=\"line\">21<\/span>\r\n<span class=\"line\">22<\/span>\r\n<span class=\"line\">23<\/span>\r\n<span class=\"line\">24<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\">   \u250c\u2500\u2500\/build\/ncurses-pKZ1BN\/ncurses-<span class=\"number\">6.0<\/span>+<span class=\"number\">20160213<\/span>\/ncurses\/tty\/tty_update.c\u2500\u2500\u2500\u2500\u2500\u2500\u2510<\/span>\r\n<span class=\"line\">   \u2502<span class=\"number\">1124<\/span>                                                                       \u2502<\/span>\r\n<span class=\"line\">   \u2502<span class=\"number\">1125<\/span>    static NCURSES_INLINE NCURSES_CH_T                                 \u2502<\/span>\r\n<span class=\"line\">   \u2502<span class=\"number\">1126<\/span>    ClrBlank(NCURSES_SP_DCLx WINDOW *win)                              \u2502<\/span>\r\n<span class=\"line\">   \u2502<span class=\"number\">1127<\/span>    {                                                                  \u2502<\/span>\r\n<span class=\"line\">   \u2502<span class=\"number\">1128<\/span>        NCURSES_CH_T blank = blankchar;                                \u2502<\/span>\r\n<span class=\"line\">  &gt;\u2502<span class=\"number\">1129<\/span>        <span class=\"keyword\">if<\/span> (back_color_erase)                                          \u2502<\/span>\r\n<span class=\"line\">   \u2502<span class=\"number\">1130<\/span>            AddAttr(blank, (AttrOf(BCE_BKGD(SP_PARM, win)) &amp; BCE_ATTRS)\u2502<\/span>\r\n<span class=\"line\">   \u2502<span class=\"number\">1131<\/span>        <span class=\"built_in\">return<\/span> blank;                                                  \u2502<\/span>\r\n<span class=\"line\">   \u2502<span class=\"number\">1132<\/span>    }                                                                  \u2502<\/span>\r\n<span class=\"line\">   \u2502<span class=\"number\">1133<\/span>                                                                       \u2502<\/span>\r\n<span class=\"line\">   \u2502<span class=\"number\">1134<\/span>    \/*                                                                 \u2502<\/span>\r\n<span class=\"line\">   \u2502<span class=\"number\">1135<\/span>    **      ClrUpdate()                                                \u2502<\/span>\r\n<span class=\"line\">   \u2502<span class=\"number\">1136<\/span>    **                                                                 \u2502<\/span>\r\n<span class=\"line\">   \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/span>\r\n<span class=\"line\">multi-thre Thread <span class=\"number\">0<\/span>x7f0a3c5e87 In: doupdate            L1129 PC: <span class=\"number\">0<\/span>x7f0a37aac40d<\/span>\r\n<span class=\"line\">warning: JITed object file architecture unknown is not compatible with target ar<\/span>\r\n<span class=\"line\">chitecture i386:x86-<span class=\"number\">64<\/span>.<\/span>\r\n<span class=\"line\">---Type &lt;<span class=\"built_in\">return<\/span>&gt; to <span class=\"built_in\">continue<\/span>, or q &lt;<span class=\"built_in\">return<\/span>&gt; to quit---<\/span>\r\n<span class=\"line\">Core was generated by `python .\/cachetop.py<span class=\"string\">'.<\/span>\r\nProgram terminated with signal SIGSEGV, Segmentation fault.\r\n#0  ClrBlank (win=0x1993060)\r\n    at \/build\/ncurses-pKZ1BN\/ncurses-6.0+20160213\/ncurses\/tty\/tty_update.c:1129\r\n(gdb)<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u68d2\u5446\uff01<\/p>\n<p>\u7bad\u5934\u00a0<code>&gt;<\/code>\u00a0\u6307\u5411\u7684\u4ee3\u7801\u5c31\u662f\u7a0b\u5e8f\u5d29\u6e83\u7684\u4f4d\u7f6e\u3002\u4f7f\u7528\u00a0<code>layout split<\/code>\u00a0\u547d\u4ee4\uff0c\u53ef\u4ee5\u8ba9\u6c47\u7f16\u6307\u4ee4\u548c\u6e90\u4ee3\u7801\u5206\u5f00\u663e\u793a\u3002<\/p>\n<figure class=\"highlight bash\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span>\r\n<span class=\"line\">2<\/span>\r\n<span class=\"line\">3<\/span>\r\n<span class=\"line\">4<\/span>\r\n<span class=\"line\">5<\/span>\r\n<span class=\"line\">6<\/span>\r\n<span class=\"line\">7<\/span>\r\n<span class=\"line\">8<\/span>\r\n<span class=\"line\">9<\/span>\r\n<span class=\"line\">10<\/span>\r\n<span class=\"line\">11<\/span>\r\n<span class=\"line\">12<\/span>\r\n<span class=\"line\">13<\/span>\r\n<span class=\"line\">14<\/span>\r\n<span class=\"line\">15<\/span>\r\n<span class=\"line\">16<\/span>\r\n<span class=\"line\">17<\/span>\r\n<span class=\"line\">18<\/span>\r\n<span class=\"line\">19<\/span>\r\n<span class=\"line\">20<\/span>\r\n<span class=\"line\">21<\/span>\r\n<span class=\"line\">22<\/span>\r\n<span class=\"line\">23<\/span>\r\n<span class=\"line\">24<\/span>\r\n<span class=\"line\">25<\/span>\r\n<span class=\"line\">26<\/span>\r\n<span class=\"line\">27<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\">   \u250c\u2500\u2500\/build\/ncurses-pKZ1BN\/ncurses-<span class=\"number\">6.0<\/span>+<span class=\"number\">20160213<\/span>\/ncurses\/tty\/tty_update.c\u2500\u2500\u2500\u2500\u2500\u2500\u2510<\/span>\r\n<span class=\"line\">  &gt;\u2502<span class=\"number\">1129<\/span>        <span class=\"keyword\">if<\/span> (back_color_erase)                                          \u2502<\/span>\r\n<span class=\"line\">   \u2502<span class=\"number\">1130<\/span>            AddAttr(blank, (AttrOf(BCE_BKGD(SP_PARM, win)) &amp; BCE_ATTRS)\u2502<\/span>\r\n<span class=\"line\">   \u2502<span class=\"number\">1131<\/span>        <span class=\"built_in\">return<\/span> blank;                                                  \u2502<\/span>\r\n<span class=\"line\">   \u2502<span class=\"number\">1132<\/span>    }                                                                  \u2502<\/span>\r\n<span class=\"line\">   \u2502<span class=\"number\">1133<\/span>                                                                       \u2502<\/span>\r\n<span class=\"line\">   \u2502<span class=\"number\">1134<\/span>    \/*                                                                 \u2502<\/span>\r\n<span class=\"line\">   \u2502<span class=\"number\">1135<\/span>    **      ClrUpdate()                                                \u2502<\/span>\r\n<span class=\"line\">   \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/span>\r\n<span class=\"line\">  &gt;\u2502<span class=\"number\">0<\/span>x7f0a37aac40d &lt;doupdate+<span class=\"number\">301<\/span>&gt;   mov    <span class=\"number\">0<\/span>x10(%rsi),%rdi                     \u2502<\/span>\r\n<span class=\"line\">   \u2502<span class=\"number\">0<\/span>x7f0a37aac411 &lt;doupdate+<span class=\"number\">305<\/span>&gt;   cmpb   <span class=\"variable\">$0x0<\/span>,<span class=\"number\">0<\/span>x1c(%rdi)                     \u2502<\/span>\r\n<span class=\"line\">   \u2502<span class=\"number\">0<\/span>x7f0a37aac415 &lt;doupdate+<span class=\"number\">309<\/span>&gt;   jne    <span class=\"number\">0<\/span>x7f0a37aac6f7 &lt;doupdate+<span class=\"number\">1047<\/span>&gt;      \u2502<\/span>\r\n<span class=\"line\">   \u2502<span class=\"number\">0<\/span>x7f0a37aac41b &lt;doupdate+<span class=\"number\">315<\/span>&gt;   movswl <span class=\"number\">0<\/span>x4(%rcx),%ecx                      \u2502<\/span>\r\n<span class=\"line\">   \u2502<span class=\"number\">0<\/span>x7f0a37aac41f &lt;doupdate+<span class=\"number\">319<\/span>&gt;   movswl <span class=\"number\">0<\/span>x74(%rdx),%edi                     \u2502<\/span>\r\n<span class=\"line\">   \u2502<span class=\"number\">0<\/span>x7f0a37aac423 &lt;doupdate+<span class=\"number\">323<\/span>&gt;   mov    %rax,<span class=\"number\">0<\/span>x40(%rsp)                     \u2502<\/span>\r\n<span class=\"line\">   \u2502<span class=\"number\">0<\/span>x7f0a37aac428 &lt;doupdate+<span class=\"number\">328<\/span>&gt;   movl   <span class=\"variable\">$0x20<\/span>,<span class=\"number\">0<\/span>x48(%rsp)                    \u2502<\/span>\r\n<span class=\"line\">   \u2502<span class=\"number\">0<\/span>x7f0a37aac430 &lt;doupdate+<span class=\"number\">336<\/span>&gt;   movl   <span class=\"variable\">$0x0<\/span>,<span class=\"number\">0<\/span>x4c(%rsp)                     \u2502<\/span>\r\n<span class=\"line\">   \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/span>\r\n<span class=\"line\">multi-thre Thread <span class=\"number\">0<\/span>x7f0a3c5e87 In: doupdate            L1129 PC: <span class=\"number\">0<\/span>x7f0a37aac40d<\/span>\r\n\r\n<span class=\"line\">chitecture i386:x86-<span class=\"number\">64<\/span>.<\/span>\r\n<span class=\"line\">Core was generated by `python .\/cachetop.py<span class=\"string\">'.<\/span>\r\nProgram terminated with signal SIGSEGV, Segmentation fault.\r\n---Type &lt;return&gt; to continue, or q &lt;return&gt; to quit---\r\n#0  ClrBlank (win=0x1993060)\r\n    at \/build\/ncurses-pKZ1BN\/ncurses-6.0+20160213\/ncurses\/tty\/tty_update.c:1129\r\n(gdb) layout split<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>Law \u5728\u5355\u6b65\u56de\u9000\u4e2d\u5c55\u793a\u4e86\u5982\u4f55\u4f7f\u7528 TUI\u3002\u4f60\u53ef\u4ee5\u60f3\u8c61\u4e00\u4e0b\uff0c\u5728\u4ee3\u7801\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\uff0c\u540c\u65f6\u5448\u73b0\u6c47\u7f16\u7801\u548c\u6e90\u4ee3\u7801\u662f\u600e\u6837\u7684\u5149\u666f\u3002<\/p>\n<h2 id=\"\u5341\u56db_\u00b7_\u5916\u90e8\u5de5\u5177\uff1acscope\">\u5341\u56db \u00b7 \u5916\u90e8\u5de5\u5177\uff1a<code>cscope<\/code><\/h2>\n<p>\u6211\u4f9d\u7136\u9700\u8981\u641e\u6e05\u695a\u00a0<code>back_color_erase<\/code>\u00a0\u5230\u5e95\u53d1\u751f\u4e86\u4ec0\u4e48\u3002\u5f53\u7136\uff0c\u6211\u53ef\u4ee5\u5728 GDB \u4e2d\u4f7f\u7528\u00a0<code>search<\/code>\u00a0\u547d\u4ee4\uff0c\u67e5\u627e\u00a0<code>back_color_erase<\/code>\u00a0\u662f\u5728\u54ea\u91cc\u5b9a\u4e49\u7684\u3002\u4e0d\u8fc7\uff0c\u6211\u66f4\u504f\u597d\u4f7f\u7528\u540d\u4e3a\u00a0<code>cscope<\/code>\u00a0\u7684\u5916\u90e8\u5de5\u5177\u3002\u8fd9\u662f\u4e00\u4e2a\u8d1d\u5c14\u5b9e\u9a8c\u5ba4\u5728\u4e0a\u4e16\u7eaa 80 \u5e74\u4ee3\u53d1\u660e\u7684\u57fa\u4e8e\u6587\u672c\u7684\u4ee3\u7801\u6d4f\u89c8\u5668\u3002\u5982\u679c\u4f60\u6709\u559c\u6b22\u7684\u73b0\u4ee3 IDE \u5de5\u5177\uff0c\u90a3\u4e48\u5c31\u7528\u4f60\u559c\u6b22\u7684\u5c31\u597d\u3002<\/p>\n<p>\u9996\u5148\uff0c\u8bbe\u7f6e\u00a0<code>cscope<\/code>\u3002<\/p>\n<figure class=\"highlight bash\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span>\r\n<span class=\"line\">2<\/span>\r\n<span class=\"line\">3<\/span>\r\n<span class=\"line\">4<\/span>\r\n<span class=\"line\">5<\/span>\r\n<span class=\"line\">6<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\"><span class=\"comment\"># apt-get install -y cscope<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\"># wget http:\/\/archive.ubuntu.com\/ubuntu\/pool\/main\/n\/ncurses\/ncurses_6.0+20160213.orig.tar.gz<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\"># tar xvf ncurses_6.0+20160213.orig.tar.gz<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\"># cd ncurses-6.0-20160213<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\"># cscope -bqR<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\"># cscope -dq<\/span><\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u6b64\u5904\u00a0<code>cscope -bqR<\/code>\u00a0\u521b\u5efa\u4e86\u67e5\u627e\u6570\u636e\u5e93\uff0c\u800c\u00a0<code>cscope -dq<\/code>\u00a0\u5219\u542f\u52a8\u4e4b\u3002<\/p>\n<p>\u641c\u7d22\u00a0<code>back_color_erase<\/code>\u00a0\u7684\u5b9a\u4e49\uff1a<\/p>\n<figure class=\"highlight bash\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span>\r\n<span class=\"line\">2<\/span>\r\n<span class=\"line\">3<\/span>\r\n<span class=\"line\">4<\/span>\r\n<span class=\"line\">5<\/span>\r\n<span class=\"line\">6<\/span>\r\n<span class=\"line\">7<\/span>\r\n<span class=\"line\">8<\/span>\r\n<span class=\"line\">9<\/span>\r\n<span class=\"line\">10<\/span>\r\n<span class=\"line\">11<\/span>\r\n<span class=\"line\">12<\/span>\r\n<span class=\"line\">13<\/span>\r\n<span class=\"line\">14<\/span>\r\n<span class=\"line\">15<\/span>\r\n<span class=\"line\">16<\/span>\r\n<span class=\"line\">17<\/span>\r\n<span class=\"line\">18<\/span>\r\n<span class=\"line\">19<\/span>\r\n<span class=\"line\">20<\/span>\r\n<span class=\"line\">21<\/span>\r\n<span class=\"line\">22<\/span>\r\n<span class=\"line\">23<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\">Cscope version <span class=\"number\">15.8<\/span>b                                   Press the ? key <span class=\"keyword\">for<\/span> <span class=\"built_in\">help<\/span><\/span>\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n<span class=\"line\">Find this C symbol:<\/span>\r\n<span class=\"line\">Find this global definition: back_color_erase<\/span>\r\n<span class=\"line\">Find <span class=\"built_in\">functions<\/span> called by this <span class=\"keyword\">function<\/span>:<\/span>\r\n<span class=\"line\">Find <span class=\"built_in\">functions<\/span> calling this <span class=\"keyword\">function<\/span>:<\/span>\r\n<span class=\"line\">Find this text string:<\/span>\r\n<span class=\"line\">Change this text string:<\/span>\r\n<span class=\"line\">Find this egrep pattern:<\/span>\r\n<span class=\"line\">Find this file:<\/span>\r\n<span class=\"line\">Find files <span class=\"comment\">#including this file:<\/span><\/span>\r\n<span class=\"line\">Find assignments to this symbol:<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u6572\u56de\u8f66\u3002<\/p>\n<figure class=\"highlight c++\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span>\r\n<span class=\"line\">2<\/span>\r\n<span class=\"line\">3<\/span>\r\n<span class=\"line\">4<\/span>\r\n<span class=\"line\">5<\/span>\r\n<span class=\"line\">6<\/span>\r\n<span class=\"line\">7<\/span>\r\n<span class=\"line\">8<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\">[...]<\/span>\r\n<span class=\"line\"><span class=\"preprocessor\">#<span class=\"keyword\">define<\/span> non_dest_scroll_region         CUR Booleans[<span class=\"number\">26<\/span>]<\/span><\/span>\r\n<span class=\"line\"><span class=\"preprocessor\">#<span class=\"keyword\">define<\/span> can_change                     CUR Booleans[<span class=\"number\">27<\/span>]<\/span><\/span>\r\n<span class=\"line\"><span class=\"preprocessor\">#<span class=\"keyword\">define<\/span> back_color_erase               CUR Booleans[<span class=\"number\">28<\/span>]<\/span><\/span>\r\n<span class=\"line\"><span class=\"preprocessor\">#<span class=\"keyword\">define<\/span> hue_lightness_saturation       CUR Booleans[<span class=\"number\">29<\/span>]<\/span><\/span>\r\n<span class=\"line\"><span class=\"preprocessor\">#<span class=\"keyword\">define<\/span> col_addr_glitch                CUR Booleans[<span class=\"number\">30<\/span>]<\/span><\/span>\r\n<span class=\"line\"><span class=\"preprocessor\">#<span class=\"keyword\">define<\/span> cr_cancels_micro_mode          CUR Booleans[<span class=\"number\">31<\/span>]<\/span><\/span>\r\n<span class=\"line\">[...]<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u597d\u5427\u2026\u2026\u8fd9\u662f\u4e00\u4e2a\u7528\u00a0<code>#define<\/code>\u00a0\u5b9a\u4e49\u7684\u5b8f\u53d8\u91cf\u3002\uff08\u5c31\u4e0d\u80fd\u5927\u5199\u5417\uff1f\u6454\uff01\uff09<\/p>\n<p>\u90a3\u4e48\uff0c<code>CUR<\/code>\u00a0\u53c8\u662f\u4ec0\u4e48\u5462\uff1f\u6211\u4eec\u7ee7\u7eed\u641c\u7d22\u3002<\/p>\n<figure class=\"highlight c++\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\"><span class=\"preprocessor\">#<span class=\"keyword\">define<\/span> CUR cur_term-&gt;type.<\/span><\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u597d\u561b\uff0c\u81f3\u5c11\u8fd9\u4e2a\u00a0<code>#define<\/code>\u00a0\u5b9a\u4e49\u7684\u5b8f\u662f\u5927\u5199\u7684\u3002<\/p>\n<p>\u78b0\u89c1\u00a0<code>cur_term<\/code>\u00a0\u4e86\u2014\u2014\u4e4b\u524d\u6211\u4eec\u5728\u5355\u6b65\u8c03\u8bd5\u6c47\u7f16\u6307\u4ee4\u548c\u68c0\u67e5\u5bc4\u5b58\u5668\u72b6\u6001\u7684\u65f6\u5019\u6709\u770b\u5230\u8fc7\u5b83\u3002\u90a3\u4e48\u5b83\u662f\u5565\u54a7\uff1f<\/p>\n<figure class=\"highlight c++\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span>\r\n<span class=\"line\">2<\/span>\r\n<span class=\"line\">3<\/span>\r\n<span class=\"line\">4<\/span>\r\n<span class=\"line\">5<\/span>\r\n<span class=\"line\">6<\/span>\r\n<span class=\"line\">7<\/span>\r\n<span class=\"line\">8<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\"><span class=\"preprocessor\">#<span class=\"keyword\">if<\/span> <span class=\"number\">0<\/span> &amp;&amp; !<span class=\"number\">0<\/span><\/span><\/span>\r\n<span class=\"line\"><span class=\"function\"><span class=\"keyword\">extern<\/span> <span class=\"title\">NCURSES_EXPORT_VAR<\/span><span class=\"params\">(TERMINAL *)<\/span> cur_term<\/span>;<\/span>\r\n<span class=\"line\"><span class=\"preprocessor\">#<span class=\"keyword\">elif<\/span> <span class=\"number\">0<\/span><\/span><\/span>\r\n<span class=\"line\">NCURSES_WRAPPED_VAR(TERMINAL *, cur_term);<\/span>\r\n<span class=\"line\"><span class=\"preprocessor\">#<span class=\"keyword\">define<\/span> cur_term   NCURSES_PUBLIC_VAR(cur_term())<\/span><\/span>\r\n<span class=\"line\"><span class=\"preprocessor\">#<span class=\"keyword\">else<\/span><\/span><\/span>\r\n<span class=\"line\"><span class=\"function\"><span class=\"keyword\">extern<\/span> <span class=\"title\">NCURSES_EXPORT_VAR<\/span><span class=\"params\">(TERMINAL *)<\/span> cur_term<\/span>;     <span class=\"comment\">\/\/ &lt;- here<\/span><\/span>\r\n<span class=\"line\"><span class=\"preprocessor\">#<span class=\"keyword\">endif<\/span><\/span><\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p><code>cscope<\/code>\u00a0\u5728\u00a0<code>\/usr\/include\/term.h<\/code>\u00a0\u4e2d\u627e\u5230\u4e86\u5b83\u3002\u6211\u5728\u6211\u8ba4\u4e3a\u771f\u6b63\u8d77\u4f5c\u7528\u7684\u5b9a\u4e49\u5904\uff0c\u7528\u6ce8\u91ca\u505a\u4e86\u6807\u8bb0\u3002\u4e3a\u4ec0\u4e48\u4f1a\u6709\u00a0<code>if 0 &amp;&amp; !0 ... elif 0<\/code>\u00a0\u8fd9\u79cd\u90a3\u5947\u602a\u7684\u5199\u6cd5\uff0c\u6211\u4e5f\u4e0d\u77e5\u9053\u2026\u2026\uff08\u4f46\u603b\u4e4b\u8981\u9605\u8bfb\u66f4\u591a\u7684\u4ee3\u7801\uff09\u6709\u65f6\uff0c\u7a0b\u5e8f\u5458\u4f1a\u4f7f\u7528\u00a0<code>#if 0<\/code>\u00a0\u4f7f\u8c03\u8bd5\u7528\u4ee3\u7801\u5728\u751f\u4ea7\u73af\u5883\u4e2d\u4e0d\u751f\u6548\u3002\u4f46\u8fd9\u90e8\u5206\u4ee3\u7801\uff0c\u770b\u4e0a\u53bb\u662f\u81ea\u52a8\u751f\u6210\u7684\u3002<\/p>\n<p>\u7ee7\u7eed\u641c\u7d22\u00a0<code>NCURSES_EXPORT_VAR<\/code>\uff0c\u4f1a\u6709\u65b0\u7684\u53d1\u73b0\u3002<\/p>\n<figure class=\"highlight c++\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\"><span class=\"preprocessor\">#  <span class=\"keyword\">define<\/span> NCURSES_EXPORT_VAR(type) NCURSES_IMPEXP type<\/span><\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u4ee5\u53ca\u00a0<code>NCURSES_IMPEXP<\/code>\u2026\u2026<\/p>\n<figure class=\"highlight c++\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span>\r\n<span class=\"line\">2<\/span>\r\n<span class=\"line\">3<\/span>\r\n<span class=\"line\">4<\/span>\r\n<span class=\"line\">5<\/span>\r\n<span class=\"line\">6<\/span>\r\n<span class=\"line\">7<\/span>\r\n<span class=\"line\">8<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\"><span class=\"keyword\">typedef<\/span> <span class=\"keyword\">struct<\/span> term {       <span class=\"comment\">\/* describe an actual terminal *\/<\/span><\/span>\r\n<span class=\"line\">    TERMTYPE    type;       <span class=\"comment\">\/* terminal type description *\/<\/span><\/span>\r\n<span class=\"line\">    <span class=\"keyword\">short<\/span>   Filedes;    <span class=\"comment\">\/* file description being written to *\/<\/span><\/span>\r\n<span class=\"line\">    TTY     Ottyb,      <span class=\"comment\">\/* original state of the terminal *\/<\/span><\/span>\r\n<span class=\"line\">        Nttyb;      <span class=\"comment\">\/* current state of the terminal *\/<\/span><\/span>\r\n<span class=\"line\">    <span class=\"keyword\">int<\/span>     _baudrate;  <span class=\"comment\">\/* used to compute padding *\/<\/span><\/span>\r\n<span class=\"line\">    <span class=\"keyword\">char<\/span> *      _termname;      <span class=\"comment\">\/* used for termname() *\/<\/span><\/span>\r\n<span class=\"line\">} TERMINAL;<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u54c8\uff01\u8fd9\u56de\u00a0<code>TERMINAL<\/code>\u00a0\u662f\u5927\u5199\u7684\u4e86\u3002\u5728\u8fd9\u5768\u5b8f\u5f53\u4e2d\uff0c\u8fd9\u7b97\u662f\u5bb9\u6613\u8ffd\u8e2a\u7684\u4e86\u3002<\/p>\n<p>\u597d\u4e86\uff0c\u73b0\u5728\u5230\u5e95\u662f\u8c01\u8bbe\u7f6e\u4e86\u00a0<code>cur_term<\/code>\u00a0\u5462\uff1f\u60f3\u60f3\u770b\uff0c\u6211\u4eec\u9047\u5230\u7684\u95ee\u9898\uff0c\u662f\u56e0\u4e3a\u00a0<code>cur_term<\/code>\u00a0\u88ab\u8bbe\u7f6e\u4e3a\u00a0<code>0x0<\/code>\uff0c\u8fd9\u53ef\u80fd\u662f\u6ca1\u6709\u521d\u59cb\u5316\u5bfc\u81f4\u7684\uff0c\u4e5f\u6709\u53ef\u80fd\u662f\u663e\u5f0f\u8bbe\u7f6e\u5bfc\u81f4\u7684\u3002\u987a\u7740\u4ee3\u7801\u68c0\u67e5\uff0c\u53ef\u80fd\u4f1a\u6709\u65b0\u7684\u7ebf\u7d22\u3002<\/p>\n<figure class=\"highlight bash\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span>\r\n<span class=\"line\">2<\/span>\r\n<span class=\"line\">3<\/span>\r\n<span class=\"line\">4<\/span>\r\n<span class=\"line\">5<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\">Find this C symbol: cur_term<\/span>\r\n<span class=\"line\">Find this global definition:<\/span>\r\n<span class=\"line\">Find <span class=\"built_in\">functions<\/span> called by this <span class=\"keyword\">function<\/span>:<\/span>\r\n<span class=\"line\">Find <span class=\"built_in\">functions<\/span> calling this <span class=\"keyword\">function<\/span>:<\/span>\r\n<span class=\"line\">[...]<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u6309\u4e0b\u56de\u8f66\uff0c\u5f97\u5230\u7ed3\u679c\u3002<\/p>\n<figure class=\"highlight c++\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span>\r\n<span class=\"line\">2<\/span>\r\n<span class=\"line\">3<\/span>\r\n<span class=\"line\">4<\/span>\r\n<span class=\"line\">5<\/span>\r\n<span class=\"line\">6<\/span>\r\n<span class=\"line\">7<\/span>\r\n<span class=\"line\">8<\/span>\r\n<span class=\"line\">9<\/span>\r\n<span class=\"line\">10<\/span>\r\n<span class=\"line\">11<\/span>\r\n<span class=\"line\">12<\/span>\r\n<span class=\"line\">13<\/span>\r\n<span class=\"line\">14<\/span>\r\n<span class=\"line\">15<\/span>\r\n<span class=\"line\">16<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\">NCURSES_EXPORT(TERMINAL *)<\/span>\r\n<span class=\"line\">NCURSES_SP_NAME(set_curterm) (NCURSES_SP_DCLx TERMINAL * termp)<\/span>\r\n<span class=\"line\">{<\/span>\r\n<span class=\"line\">    TERMINAL *oldterm;<\/span>\r\n\r\n<span class=\"line\">    T((T_CALLED(<span class=\"string\">\"set_curterm(%p)\"<\/span>), (<span class=\"keyword\">void<\/span> *) termp));<\/span>\r\n\r\n<span class=\"line\">    _nc_lock_global(curses);<\/span>\r\n<span class=\"line\">    oldterm = cur_term;<\/span>\r\n<span class=\"line\">    <span class=\"keyword\">if<\/span> (SP_PARM)<\/span>\r\n<span class=\"line\">    SP_PARM-&gt;_term = termp;<\/span>\r\n<span class=\"line\"><span class=\"preprocessor\">#<span class=\"keyword\">if<\/span> USE_REENTRANT<\/span><\/span>\r\n<span class=\"line\">    CurTerm = termp;<\/span>\r\n<span class=\"line\"><span class=\"preprocessor\">#<span class=\"keyword\">else<\/span><\/span><\/span>\r\n<span class=\"line\">    cur_term = termp;   <span class=\"comment\">\/\/ &lt;- here<\/span><\/span>\r\n<span class=\"line\"><span class=\"preprocessor\">#<span class=\"keyword\">endif<\/span><\/span><\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u540c\u6837\uff0c\u6211\u5bf9\u5b9e\u9645\u751f\u6548\u7684\u90e8\u5206\u505a\u4e86\u6807\u8bb0\u3002\u5c3d\u7ba1\u51fd\u6570\u540d\u5b57\u88ab\u5305\u5728\u5b8f\u53d8\u91cf\u5f53\u4e2d\uff0c\u4f46\u662f\u6211\u4eec\u81f3\u5c11\u77e5\u9053\u00a0<code>cur_term<\/code>\u00a0\u662f\u5982\u4f55\u8bbe\u7f6e\u7684\u4e86\u2014\u2014\u901a\u8fc7\u00a0<code>set_curterm()<\/code>\u00a0\u51fd\u6570\u3002\u8fd9\u4e2a\u51fd\u6570\u662f\u6ca1\u6709\u88ab\u8c03\u7528\u5417\uff1f<\/p>\n<h2 id=\"\u5341\u4e94_\u00b7_\u5916\u90e8\u5de5\u5177\uff1aperf-tools\/ftrace\/uprobes\">\u5341\u4e94 \u00b7 \u5916\u90e8\u5de5\u5177\uff1a<code>perf-tools\/ftrace\/uprobes<\/code><\/h2>\n<p>\u6211\u7a0d\u540e\u5c06\u4ecb\u7ecd\u5982\u4f55\u4f7f\u7528 GDB \u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\uff0c\u4f46\u6211\u60f3\u8bd5\u7740\u7528\u6211\u7684\u00a0<a href=\"https:\/\/github.com\/brendangregg\/perf-tools\" target=\"_blank\" rel=\"external noopener noreferrer\">perf-tools<\/a>\u00a0\u5de5\u5177\u96c6\u5f53\u4e2d\u7684\u00a0<code>uprobe<\/code>\u00a0\u5de5\u5177\u6765\u89e3\u51b3\u95ee\u9898\u3002\u5b83\u4f7f\u7528\u4e86 Linux \u63d0\u4f9b\u7684\u00a0<code>ftrace<\/code>\u00a0\u4ee5\u53ca\u00a0<code>uprobes<\/code>\u00a0\u4e24\u4e2a\u5de5\u5177\u3002\u4f7f\u7528\u8ddf\u8e2a\u5668\u7684\u597d\u5904\u662f\u4e0d\u9700\u8981\u50cf GDB \u90a3\u6837\u6682\u505c\u76ee\u6807\u8fdb\u7a0b\u2014\u2014\u5f53\u7136\uff0c\u5728\u8fd9\u4e2a\u4f8b\u5b50\u91cc\u8fd9\u6ca1\u6240\u8c13\u5c31\u662f\u4e86\u3002\u6b64\u5916\uff0c\u4f7f\u7528\u8ddf\u8e2a\u5668\u8ffd\u8e2a\u4e00\u4e2a\u4e8b\u4ef6\u548c\u8ffd\u8e2a\u6210\u767e\u4e0a\u5343\u4e2a\u4e8b\u4ef6\u662f\u4e00\u6837\u7684\u3002<\/p>\n<p>\u4e3a\u6b64\uff0c\u6211\u9700\u8981\u8ffd\u8e2a\u00a0<code>set_curterm<\/code>\u00a0\u7684\u8c03\u7528\uff0c\u5e76\u4e14\u6253\u5370\u5176\u9996\u4e2a\u53c2\u6570\u3002<\/p>\n<figure class=\"highlight bash\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span>\r\n<span class=\"line\">2<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\"><span class=\"comment\"># \/apps\/perf-tools\/bin\/uprobe 'p:\/lib\/x86_64-linux-gnu\/libncursesw.so.5:set_curterm %di'<\/span><\/span>\r\n<span class=\"line\">ERROR: missing symbol <span class=\"string\">\"set_curterm\"<\/span> <span class=\"keyword\">in<\/span> \/lib\/x86_64-linux-gnu\/libncursesw.so.<span class=\"number\">5<\/span><\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u597d\u5427\uff0c\u5728\u00a0<code>libncursesw<\/code>\u00a0\u91cc\u6ca1\u89c1\u7740\u6709\u00a0<code>set_curterm<\/code>\u3002\u90a3\u4e48\u5b83\u5728\u54ea\u91cc\u5462\uff1f\u6211\u4eec\u53ef\u4ee5\u7528 GDB \u6216\u8005\u00a0<code>objdump<\/code>\u00a0\u67e5\u627e\u4e00\u4e0b\u3002<\/p>\n<figure class=\"highlight bash\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span>\r\n<span class=\"line\">2<\/span>\r\n<span class=\"line\">3<\/span>\r\n<span class=\"line\">4<\/span>\r\n<span class=\"line\">5<\/span>\r\n<span class=\"line\">6<\/span>\r\n<span class=\"line\">7<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\">(gdb) info symbol <span class=\"built_in\">set<\/span>_curterm<\/span>\r\n<span class=\"line\"><span class=\"built_in\">set<\/span>_curterm <span class=\"keyword\">in<\/span> section .text of \/lib\/x86_64-linux-gnu\/libtinfo.so.<span class=\"number\">5<\/span><\/span>\r\n\r\n<span class=\"line\"><span class=\"comment\"># objdump -tT \/lib\/x86_64-linux-gnu\/libncursesw.so.5 | grep cur_term<\/span><\/span>\r\n<span class=\"line\"><span class=\"number\">0000000000000000<\/span>      DO *UND*  <span class=\"number\">0000000000000000<\/span>  NCURSES_TINFO_5.<span class=\"number\">0.19991023<\/span> cur_term<\/span>\r\n<span class=\"line\"><span class=\"comment\"># objdump -tT \/lib\/x86_64-linux-gnu\/libtinfo.so.5 | grep cur_term<\/span><\/span>\r\n<span class=\"line\"><span class=\"number\">0000000000228948<\/span> g    DO .bss   <span class=\"number\">0000000000000008<\/span>  NCURSES_TINFO_5.<span class=\"number\">0.19991023<\/span> cur_term<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u663e\u800c\u6613\u89c1\uff0c\u5728\u6b64\u5904 GDB \u66f4\u597d\u4f7f\u4e9b\u3002\u5982\u679c\u4f60\u8db3\u591f\u4ed4\u7ec6\u7684\u8bdd\uff0c\u4f60\u4f1a\u53d1\u73b0\uff0c\u8fd9\u4e2a\u51fd\u6570\u5b9a\u4e49\u5728\u00a0<code>libtinfo<\/code>\u00a0\u5f53\u4e2d\u3002\u90a3\u4e48\uff0c\u8ba9\u6211\u4eec\u5c1d\u8bd5\u5728\u00a0<code>libtinfo<\/code>\u3000\u4e2d\u53bb\u8ffd\u8e2a\u00a0<code>set_curterm<\/code>\u3002<\/p>\n<figure class=\"highlight bash\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span>\r\n<span class=\"line\">2<\/span>\r\n<span class=\"line\">3<\/span>\r\n<span class=\"line\">4<\/span>\r\n<span class=\"line\">5<\/span>\r\n<span class=\"line\">6<\/span>\r\n<span class=\"line\">7<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\"><span class=\"comment\"># \/apps\/perf-tools\/bin\/uprobe 'p:\/lib\/x86_64-linux-gnu\/libtinfo.so.5:set_curterm %di'<\/span><\/span>\r\n<span class=\"line\">Tracing uprobe <span class=\"built_in\">set<\/span>_curterm (p:<span class=\"built_in\">set<\/span>_curterm \/lib\/x86_64-linux-gnu\/libtinfo.so.<span class=\"number\">5<\/span>:<span class=\"number\">0<\/span>xfa80 %di). Ctrl-C to end.<\/span>\r\n<span class=\"line\">          python-<span class=\"number\">31617<\/span> [<span class=\"number\">007<\/span>] d... <span class=\"number\">24236402.719959<\/span>: <span class=\"built_in\">set<\/span>_curterm: (<span class=\"number\">0<\/span>x7f116fcc2a80) arg1=<span class=\"number\">0<\/span>x1345d70<\/span>\r\n<span class=\"line\">          python-<span class=\"number\">31617<\/span> [<span class=\"number\">007<\/span>] d... <span class=\"number\">24236402.720033<\/span>: <span class=\"built_in\">set<\/span>_curterm: (<span class=\"number\">0<\/span>x7f116fcc2a80) arg1=<span class=\"number\">0<\/span>x13a22e0<\/span>\r\n<span class=\"line\">          python-<span class=\"number\">31617<\/span> [<span class=\"number\">007<\/span>] d... <span class=\"number\">24236402.723804<\/span>: <span class=\"built_in\">set<\/span>_curterm: (<span class=\"number\">0<\/span>x7f116fcc2a80) arg1=<span class=\"number\">0<\/span>x14cdfa0<\/span>\r\n<span class=\"line\">          python-<span class=\"number\">31617<\/span> [<span class=\"number\">007<\/span>] d... <span class=\"number\">24236402.723838<\/span>: <span class=\"built_in\">set<\/span>_curterm: (<span class=\"number\">0<\/span>x7f116fcc2a80) arg1=<span class=\"number\">0<\/span>x0<\/span>\r\n<span class=\"line\">^C<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u8fd9\u4f1a\u6ca1\u95ee\u9898\u4e86\u3002\u663e\u800c\u6613\u89c1\uff0c<code>set_curterm<\/code>\u00a0\u786e\u5b9e\u662f\u6709\u88ab\u8c03\u7528\u7684\uff0c\u5e76\u4e14\u88ab\u8c03\u7528\u4e86 4 \u6b21\u3002\u5728\u6700\u540e\u4e00\u6b21\u8c03\u7528\u65f6\uff08\u4e4b\u540e\u8fdb\u7a0b\u5c31\u5d29\u6e83\u4e86\uff09\uff0c\u7b2c\u4e00\u4e2a\u53c2\u6570\u662f\u00a0<code>0x0<\/code>\uff0c\u770b\u8d77\u6765\u4f3c\u4e4e\u5c31\u662f\u95ee\u9898\u6240\u5728\u4e86\u3002<\/p>\n<p>\u81f3\u4e8e\u4e3a\u4ec0\u4e48\u8981\u6253\u5370\u00a0<code>%di<\/code>\u00a0\u8fd9\u4e2a\u5bc4\u5b58\u5668\u4e2d\u7684\u503c\uff0c\u662f\u56e0\u4e3a\u6211\u4eec\u7684\u7a0b\u5e8f\u8fd0\u884c\u5728\u00a0<code>x86_64<\/code>\u00a0\u5e73\u53f0\u3002\u4f7f\u7528\u00a0<code>man syscall<\/code>\u00a0\u53ef\u4ee5\u770b\u5230\u6709\u7528\u7684\u4fe1\u606f\u3002<\/p>\n<figure class=\"highlight bash\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span>\r\n<span class=\"line\">2<\/span>\r\n<span class=\"line\">3<\/span>\r\n<span class=\"line\">4<\/span>\r\n<span class=\"line\">5<\/span>\r\n<span class=\"line\">6<\/span>\r\n<span class=\"line\">7<\/span>\r\n<span class=\"line\">8<\/span>\r\n<span class=\"line\">9<\/span>\r\n<span class=\"line\">10<\/span>\r\n<span class=\"line\">11<\/span>\r\n<span class=\"line\">12<\/span>\r\n<span class=\"line\">13<\/span>\r\n<span class=\"line\">14<\/span>\r\n<span class=\"line\">15<\/span>\r\n<span class=\"line\">16<\/span>\r\n<span class=\"line\">17<\/span>\r\n<span class=\"line\">18<\/span>\r\n<span class=\"line\">19<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\"><span class=\"comment\"># man syscall<\/span><\/span>\r\n<span class=\"line\">[...]<\/span>\r\n<span class=\"line\">       arch\/ABI      arg1  arg2  arg3  arg4  arg5  arg6  arg7  Notes<\/span>\r\n<span class=\"line\">       \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500<\/span>\r\n<span class=\"line\">       arm\/OABI      a1    a2    a3    a4    v1    v2    v3<\/span>\r\n<span class=\"line\">       arm\/EABI      r0    r1    r2    r3    r4    r5    r6<\/span>\r\n<span class=\"line\">       arm64         x0    x1    x2    x3    x4    x5    -<\/span>\r\n<span class=\"line\">       blackfin      R0    R1    R2    R3    R4    R5    -<\/span>\r\n<span class=\"line\">       i386          ebx   ecx   edx   esi   edi   ebp   -<\/span>\r\n<span class=\"line\">       ia64          out0  out1  out2  out3  out4  out5  -<\/span>\r\n<span class=\"line\">       mips\/o32      a0    a1    a2    a3    -     -     -     See below<\/span>\r\n<span class=\"line\">       mips\/n32,<span class=\"number\">64<\/span>   a0    a1    a2    a3    a4    a5    -<\/span>\r\n<span class=\"line\">       parisc        r26   r25   r24   r23   r22   r21   -<\/span>\r\n<span class=\"line\">       s390          r2    r3    r4    r5    r6    r7    -<\/span>\r\n<span class=\"line\">       s390x         r2    r3    r4    r5    r6    r7    -<\/span>\r\n<span class=\"line\">       sparc\/<span class=\"number\">32<\/span>      o0    o1    o2    o3    o4    o5    -<\/span>\r\n<span class=\"line\">       sparc\/<span class=\"number\">64<\/span>      o0    o1    o2    o3    o4    o5    -<\/span>\r\n<span class=\"line\">       x86_64        rdi   rsi   rdx   r10   r8    r9    -<\/span>\r\n<span class=\"line\">[...]<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u6211\u8fd8\u60f3\u53bb\u770b\u770b\u4e3a\u4ec0\u4e48\u4f1a\u5728\u8c03\u7528\u00a0<code>set_curterm<\/code>\u00a0\u65f6\u4f20\u5165\u00a0<code>0x0<\/code>\u00a0\u4f5c\u4e3a\u53c2\u6570\uff0c\u4e0d\u8fc7\u5f53\u524d\u00a0<code>ftrace<\/code>\u00a0\u4e0d\u652f\u6301\u8c03\u7528\u6808\u7684\u67e5\u8be2\u3002<\/p>\n<h2 id=\"\u5341\u516d_\u00b7_\u5916\u90e8\u5de5\u5177\uff1abcc\/BPF\">\u5341\u516d \u00b7 \u5916\u90e8\u5de5\u5177\uff1a<code>bcc<\/code>\/BPF<\/h2>\n<p>\u8003\u8651\u5230\u6211\u4eec\u6b63\u5728\u8c03\u8bd5\u00a0<code>bcc<\/code>\u00a0\u5de5\u5177\u00a0<code>cachetop.py<\/code>\uff0c\u90a3\u4e48\u4f7f\u7528\u00a0<code>bcc<\/code>\u00a0\u63d0\u4f9b\u7684\u00a0<code>trace.py<\/code>\u00a0\u6765\u8ffd\u8e2a\u51fd\u6570\u8c03\u7528\u662f\u4e2a\u4e0d\u9519\u7684\u9009\u62e9\u3002\u5b83\u548c\u521a\u624d\u7684\u00a0<code>uprobe<\/code>\u00a0\u5de5\u5177\u6709\u7c7b\u4f3c\u7684\u529f\u80fd\u3002<\/p>\n<figure class=\"highlight bash\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span>\r\n<span class=\"line\">2<\/span>\r\n<span class=\"line\">3<\/span>\r\n<span class=\"line\">4<\/span>\r\n<span class=\"line\">5<\/span>\r\n<span class=\"line\">6<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\"><span class=\"comment\"># .\/trace.py 'p:tinfo:set_curterm \"%d\", arg1'<\/span><\/span>\r\n<span class=\"line\">TIME     PID    COMM         FUNC             -<\/span>\r\n<span class=\"line\"><span class=\"number\">01<\/span>:<span class=\"number\">00<\/span>:<span class=\"number\">20<\/span> <span class=\"number\">31698<\/span>  python       <span class=\"built_in\">set<\/span>_curterm      <span class=\"number\">38018416<\/span><\/span>\r\n<span class=\"line\"><span class=\"number\">01<\/span>:<span class=\"number\">00<\/span>:<span class=\"number\">20<\/span> <span class=\"number\">31698<\/span>  python       <span class=\"built_in\">set<\/span>_curterm      <span class=\"number\">38396640<\/span><\/span>\r\n<span class=\"line\"><span class=\"number\">01<\/span>:<span class=\"number\">00<\/span>:<span class=\"number\">20<\/span> <span class=\"number\">31698<\/span>  python       <span class=\"built_in\">set<\/span>_curterm      <span class=\"number\">39624608<\/span><\/span>\r\n<span class=\"line\"><span class=\"number\">01<\/span>:<span class=\"number\">00<\/span>:<span class=\"number\">20<\/span> <span class=\"number\">31698<\/span>  python       <span class=\"built_in\">set<\/span>_curterm      <span class=\"number\">0<\/span><\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u6ca1\u9519\uff01\u6211\u4eec\u5728\u7528\u00a0<code>bcc<\/code>\u00a0\u6765\u8c03\u8bd5\u00a0<code>bcc<\/code>\u3002<\/p>\n<p>\u5982\u679c\u4f60\u4e4b\u524d\u672a\u66fe\u4f7f\u7528\u8fc7\u00a0<a href=\"https:\/\/github.com\/iovisor\/bcc\" target=\"_blank\" rel=\"external noopener noreferrer\"><code>bcc<\/code><\/a>\uff0c\u90a3\u4e48\u6211\u63a8\u8350\u4f60\u8bd5\u8bd5\u770b\u3002\u5b83\u6709\u9762\u5411 Python \u548c Lua \u7684\u63a5\u53e3\uff0c\u63d0\u4f9b\u4e86\u5728 Linux 4.x \u7cfb\u5217\u4e2d\u7684 BPF \u8ddf\u8e2a\u7279\u6027\u3002\u7b80\u5355\u6765\u8bf4\uff0c\u5b83\u8ba9\u5f88\u591a\u4ee5\u524d\u65e0\u6cd5\u6216\u8005\u96be\u4ee5\u5b9e\u73b0\u7684\u6027\u80fd\u5de5\u5177\u53d8\u5f97\u53ef\u884c\u3002\u5728\u00a0<a href=\"http:\/\/www.brendangregg.com\/blog\/2016-06-14\/ubuntu-xenial-bcc-bpf.html\" target=\"_blank\" rel=\"external noopener noreferrer\">Ubuntu Xenial<\/a>\u00a0\u4e0a\u6709\u6211\u5173\u4e8e\u6b64\u7684\u4ecb\u7ecd\u3002<\/p>\n<h2 id=\"\u5341\u4e03_\u00b7_\u66f4\u591a\u7684\u65ad\u70b9\">\u5341\u4e03 \u00b7 \u66f4\u591a\u7684\u65ad\u70b9<\/h2>\n<p>\u6211\u672c\u8be5\u7528 GDB \u7ed9\u00a0<code>set_curterm<\/code>\u00a0\u8bbe\u7f6e\u65ad\u70b9\u7684\uff0c\u4f46\u662f\u7ed5\u9053\u53bb\u00a0<code>ftrace<\/code>\u00a0\u548c BPF \u4e5f\u65f6\u5f88\u6709\u8da3\u7684\u4e8b\u60c5\u3002<\/p>\n<p>\u56de\u5230 GDB\u3002<\/p>\n<figure class=\"highlight bash\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span>\r\n<span class=\"line\">2<\/span>\r\n<span class=\"line\">3<\/span>\r\n<span class=\"line\">4<\/span>\r\n<span class=\"line\">5<\/span>\r\n<span class=\"line\">6<\/span>\r\n<span class=\"line\">7<\/span>\r\n<span class=\"line\">8<\/span>\r\n<span class=\"line\">9<\/span>\r\n<span class=\"line\">10<\/span>\r\n<span class=\"line\">11<\/span>\r\n<span class=\"line\">12<\/span>\r\n<span class=\"line\">13<\/span>\r\n<span class=\"line\">14<\/span>\r\n<span class=\"line\">15<\/span>\r\n<span class=\"line\">16<\/span>\r\n<span class=\"line\">17<\/span>\r\n<span class=\"line\">18<\/span>\r\n<span class=\"line\">19<\/span>\r\n<span class=\"line\">20<\/span>\r\n<span class=\"line\">21<\/span>\r\n<span class=\"line\">22<\/span>\r\n<span class=\"line\">23<\/span>\r\n<span class=\"line\">24<\/span>\r\n<span class=\"line\">25<\/span>\r\n<span class=\"line\">26<\/span>\r\n<span class=\"line\">27<\/span>\r\n<span class=\"line\">28<\/span>\r\n<span class=\"line\">29<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\"><span class=\"comment\"># gdb `which python`<\/span><\/span>\r\n<span class=\"line\">GNU gdb (Ubuntu <span class=\"number\">7.11<\/span>.<span class=\"number\">1<\/span>-<span class=\"number\">0<\/span>ubuntu1~<span class=\"number\">16.04<\/span>) <span class=\"number\">7.11<\/span>.<span class=\"number\">1<\/span><\/span>\r\n<span class=\"line\">[...]<\/span>\r\n<span class=\"line\">(gdb) b <span class=\"built_in\">set<\/span>_curterm<\/span>\r\n<span class=\"line\">Function <span class=\"string\">\"set_curterm\"<\/span> not defined.<\/span>\r\n<span class=\"line\">Make breakpoint pending on future shared library load? (y or [n]) y<\/span>\r\n<span class=\"line\">Breakpoint <span class=\"number\">1<\/span> (<span class=\"built_in\">set<\/span>_curterm) pending.<\/span>\r\n<span class=\"line\">(gdb) r cachetop.py<\/span>\r\n<span class=\"line\">Starting program: \/usr\/bin\/python cachetop.py<\/span>\r\n<span class=\"line\">[Thread debugging using libthread_db enabled]<\/span>\r\n<span class=\"line\">Using host libthread_db library <span class=\"string\">\"\/lib\/x86_64-linux-gnu\/libthread_db.so.1\"<\/span>.<\/span>\r\n\r\n<span class=\"line\">Breakpoint <span class=\"number\">1<\/span>, <span class=\"built_in\">set<\/span>_curterm (termp=termp@entry=<span class=\"number\">0<\/span>xa43150) at \/build\/ncurses-pKZ1BN\/ncurses-<span class=\"number\">6.0<\/span>+<span class=\"number\">20160213<\/span>\/ncurses\/tinfo\/lib_cur_term.c:<span class=\"number\">80<\/span><\/span>\r\n<span class=\"line\"><span class=\"number\">80<\/span>  {<\/span>\r\n<span class=\"line\">(gdb) c<\/span>\r\n<span class=\"line\">Continuing.<\/span>\r\n\r\n<span class=\"line\">Breakpoint <span class=\"number\">1<\/span>, <span class=\"built_in\">set<\/span>_curterm (termp=termp@entry=<span class=\"number\">0<\/span>xab5870) at \/build\/ncurses-pKZ1BN\/ncurses-<span class=\"number\">6.0<\/span>+<span class=\"number\">20160213<\/span>\/ncurses\/tinfo\/lib_cur_term.c:<span class=\"number\">80<\/span><\/span>\r\n<span class=\"line\"><span class=\"number\">80<\/span>  {<\/span>\r\n<span class=\"line\">(gdb) c<\/span>\r\n<span class=\"line\">Continuing.<\/span>\r\n\r\n<span class=\"line\">Breakpoint <span class=\"number\">1<\/span>, <span class=\"built_in\">set<\/span>_curterm (termp=termp@entry=<span class=\"number\">0<\/span>xbecb90) at \/build\/ncurses-pKZ1BN\/ncurses-<span class=\"number\">6.0<\/span>+<span class=\"number\">20160213<\/span>\/ncurses\/tinfo\/lib_cur_term.c:<span class=\"number\">80<\/span><\/span>\r\n<span class=\"line\"><span class=\"number\">80<\/span>  {<\/span>\r\n<span class=\"line\">(gdb) c<\/span>\r\n<span class=\"line\">Continuing.<\/span>\r\n\r\n<span class=\"line\">Breakpoint <span class=\"number\">1<\/span>, <span class=\"built_in\">set<\/span>_curterm (termp=<span class=\"number\">0<\/span>x0) at \/build\/ncurses-pKZ1BN\/ncurses-<span class=\"number\">6.0<\/span>+<span class=\"number\">20160213<\/span>\/ncurses\/tinfo\/lib_cur_term.c:<span class=\"number\">80<\/span><\/span>\r\n<span class=\"line\"><span class=\"number\">80<\/span>  {<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u597d\u4e86\uff0c\u5728\u65ad\u70b9\u5904\uff0c\u6211\u4eec\u770b\u5230\u00a0<code>set_curterm<\/code>\u00a0\u88ab\u4f20\u5165\u4e86\u53c2\u6570\u00a0<code>termp=0x0<\/code>\u3002\u5e78\u597d\u80fd\u6709\u8fd9\u4e9b\u8c03\u8bd5\u4fe1\u606f\uff0c\u5426\u5219\uff0c\u6211\u5c31\u4e0d\u5f97\u4e0d\u5728\u5404\u4e2a\u65ad\u70b9\u53bb\u6253\u5370\u5bc4\u5b58\u5668\u72b6\u6001\u4e86\u3002<\/p>\n<p>\u73b0\u5728\uff0c\u67e5\u770b\u9006\u5411\u8ffd\u6eaf\u8c03\u7528\u6808\uff0c\u5e94\u5f53\u53ef\u4ee5\u770b\u5230\u662f\u54ea\u4e2a\u51fd\u6570\u5c06\u00a0<code>0x0<\/code>\u00a0\u4f20\u7ed9\u4e86\u00a0<code>set_curterm<\/code>\u3002<\/p>\n<figure class=\"highlight bash\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span>\r\n<span class=\"line\">2<\/span>\r\n<span class=\"line\">3<\/span>\r\n<span class=\"line\">4<\/span>\r\n<span class=\"line\">5<\/span>\r\n<span class=\"line\">6<\/span>\r\n<span class=\"line\">7<\/span>\r\n<span class=\"line\">8<\/span>\r\n<span class=\"line\">9<\/span>\r\n<span class=\"line\">10<\/span>\r\n<span class=\"line\">11<\/span>\r\n<span class=\"line\">12<\/span>\r\n<span class=\"line\">13<\/span>\r\n<span class=\"line\">14<\/span>\r\n<span class=\"line\">15<\/span>\r\n<span class=\"line\">16<\/span>\r\n<span class=\"line\">17<\/span>\r\n<span class=\"line\">18<\/span>\r\n<span class=\"line\">19<\/span>\r\n<span class=\"line\">20<\/span>\r\n<span class=\"line\">21<\/span>\r\n<span class=\"line\">22<\/span>\r\n<span class=\"line\">23<\/span>\r\n<span class=\"line\">24<\/span>\r\n<span class=\"line\">25<\/span>\r\n<span class=\"line\">26<\/span>\r\n<span class=\"line\">27<\/span>\r\n<span class=\"line\">28<\/span>\r\n<span class=\"line\">29<\/span>\r\n<span class=\"line\">30<\/span>\r\n<span class=\"line\">31<\/span>\r\n<span class=\"line\">32<\/span>\r\n<span class=\"line\">33<\/span>\r\n<span class=\"line\">34<\/span>\r\n<span class=\"line\">35<\/span>\r\n<span class=\"line\">36<\/span>\r\n<span class=\"line\">37<\/span>\r\n<span class=\"line\">38<\/span>\r\n<span class=\"line\">39<\/span>\r\n<span class=\"line\">40<\/span>\r\n<span class=\"line\">41<\/span>\r\n<span class=\"line\">42<\/span>\r\n<span class=\"line\">43<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\">(gdb) bt<\/span>\r\n<span class=\"line\"><span class=\"comment\">#0  set_curterm (termp=0x0) at \/build\/ncurses-pKZ1BN\/ncurses-6.0+20160213\/ncurses\/tinfo\/lib_cur_term.c:80<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#1  0x00007ffff5a44e75 in llvm::sys::Process::FileDescriptorHasColors(int) () from \/usr\/lib\/x86_64-linux-gnu\/libbcc.so.0<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#2  0x00007ffff45cabb8 in clang::driver::tools::Clang::ConstructJob(clang::driver::Compilation&amp;, clang::driver::JobAction const&amp;, clang::driver::InputInfo const&amp;, llvm::SmallVector&lt;clang::driver::InputInfo, 4u&gt; const&amp;, llvm::opt::ArgList const&amp;, char const*) const () from \/usr\/lib\/x86_64-linux-gnu\/libbcc.so.0<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#3  0x00007ffff456ffa5 in clang::driver::Driver::BuildJobsForAction(clang::driver::Compilation&amp;, clang::driver::Action const*, clang::driver::ToolChain const*, char const*, bool, bool, char const*, clang::driver::InputInfo&amp;) const () from \/usr\/lib\/x86_64-linux-gnu\/libbcc.so.0<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#4  0x00007ffff4570501 in clang::driver::Driver::BuildJobs(clang::driver::Compilation&amp;) const () from \/usr\/lib\/x86_64-linux-gnu\/libbcc.so.0<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#5  0x00007ffff457224a in clang::driver::Driver::BuildCompilation(llvm::ArrayRef&lt;char const*&gt;) () from \/usr\/lib\/x86_64-linux-gnu\/libbcc.so.0<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#6  0x00007ffff4396cda in ebpf::ClangLoader::parse(std::unique_ptr&lt;llvm::Module, std::default_delete&lt;llvm::Module&gt; &gt;*, std::unique_ptr&lt;std::vector&lt;ebpf::TableDesc, std::allocator&lt;ebpf::TableDesc&gt; &gt;, std::default_delete&lt;std::vector&lt;ebpf::TableDesc, std::allocator&lt;ebpf::TableDesc&gt; &gt; &gt; &gt;*, std::__cxx11::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; const&amp;, bool, char const**, int) () from \/usr\/lib\/x86_64-linux-gnu\/libbcc.so.0<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#7  0x00007ffff4344314 in ebpf::BPFModule::load_cfile(std::__cxx11::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; const&amp;, bool, char const**, int) ()<\/span><\/span>\r\n<span class=\"line\">   from \/usr\/lib\/x86_64-linux-gnu\/libbcc.so.<span class=\"number\">0<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#8  0x00007ffff4349e5e in ebpf::BPFModule::load_string(std::__cxx11::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; const&amp;, char const**, int) ()<\/span><\/span>\r\n<span class=\"line\">   from \/usr\/lib\/x86_64-linux-gnu\/libbcc.so.<span class=\"number\">0<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#9  0x00007ffff43430c8 in bpf_module_create_c_from_string () from \/usr\/lib\/x86_64-linux-gnu\/libbcc.so.0<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#10 0x00007ffff690ae40 in ffi_call_unix64 () from \/usr\/lib\/x86_64-linux-gnu\/libffi.so.6<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#11 0x00007ffff690a8ab in ffi_call () from \/usr\/lib\/x86_64-linux-gnu\/libffi.so.6<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#12 0x00007ffff6b1a68c in _ctypes_callproc () from \/usr\/lib\/python2.7\/lib-dynload\/_ctypes.x86_64-linux-gnu.so<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#13 0x00007ffff6b1ed82 in ?? () from \/usr\/lib\/python2.7\/lib-dynload\/_ctypes.x86_64-linux-gnu.so<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#14 0x00000000004b1153 in PyObject_Call ()<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#15 0x00000000004ca5ca in PyEval_EvalFrameEx ()<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#16 0x00000000004c2e05 in PyEval_EvalCodeEx ()<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#17 0x00000000004def08 in ?? ()<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#18 0x00000000004b1153 in PyObject_Call ()<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#19 0x00000000004f4c3e in ?? ()<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#20 0x00000000004b1153 in PyObject_Call ()<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#21 0x00000000004f49b7 in ?? ()<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#22 0x00000000004b6e2c in ?? ()<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#23 0x00000000004b1153 in PyObject_Call ()<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#24 0x00000000004ca5ca in PyEval_EvalFrameEx ()<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#25 0x00000000004c2e05 in PyEval_EvalCodeEx ()<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#26 0x00000000004def08 in ?? ()<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#27 0x00000000004b1153 in PyObject_Call ()<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#28 0x00000000004c73ec in PyEval_EvalFrameEx ()<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#29 0x00000000004c2e05 in PyEval_EvalCodeEx ()<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#30 0x00000000004caf42 in PyEval_EvalFrameEx ()<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#31 0x00000000004c2e05 in PyEval_EvalCodeEx ()<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#32 0x00000000004c2ba9 in PyEval_EvalCode ()<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#33 0x00000000004f20ef in ?? ()<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#34 0x00000000004eca72 in PyRun_FileExFlags ()<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#35 0x00000000004eb1f1 in PyRun_SimpleFileExFlags ()<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#36 0x000000000049e18a in Py_Main ()<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#37 0x00007ffff7811830 in __libc_start_main (main=0x49daf0 &lt;main&gt;, argc=2, argv=0x7fffffffdfb8, init=&lt;optimized out&gt;, fini=&lt;optimized out&gt;, rtld_fini=&lt;optimized out&gt;,<\/span><\/span>\r\n<span class=\"line\">    stack_end=<span class=\"number\">0<\/span>x7fffffffdfa8) at ..\/csu\/libc-start.c:<span class=\"number\">291<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#38 0x000000000049da19 in _start ()<\/span><\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u5514\u2026\u2026\u8fd9\u56de\u6709\u66f4\u591a\u4fe1\u606f\u4e86\u3002<code>set_curterm<\/code>\u00a0\u662f\u88ab\u00a0<code>llvm::sys::Process::FileDescriptorHasColors()<\/code>\u00a0\u8c03\u7528\u7684\uff0c<code>llvm<\/code>\u00a0\u7f16\u8bd1\u5668\u6709\u95ee\u9898\uff1f<\/p>\n<h2 id=\"\u5341\u516b_\u00b7_\u5916\u90e8\u5de5\u5177\uff1a\u518d\u6b21\u4f7f\u7528_cscope\">\u5341\u516b \u00b7 \u5916\u90e8\u5de5\u5177\uff1a\u518d\u6b21\u4f7f\u7528\u00a0<code>cscope<\/code><\/h2>\n<p>\u8fd9\u56de\uff0c\u6211\u4eec\u9700\u8981\u4f7f\u7528\u00a0<code>cscope<\/code>\u00a0\u770b\u770b\u00a0<code>llvm<\/code>\u00a0\u7684\u4ee3\u7801\u3002<code>FileDescriptorHasColors<\/code>\u00a0\u51fd\u6570\u662f\u9171\u5a76\u7684\u3002<\/p>\n<figure class=\"highlight c++\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span>\r\n<span class=\"line\">2<\/span>\r\n<span class=\"line\">3<\/span>\r\n<span class=\"line\">4<\/span>\r\n<span class=\"line\">5<\/span>\r\n<span class=\"line\">6<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\"><span class=\"function\"><span class=\"keyword\">static<\/span> <span class=\"keyword\">bool<\/span> <span class=\"title\">terminalHasColors<\/span><span class=\"params\">(<span class=\"keyword\">int<\/span> fd)<\/span> <\/span>{<\/span>\r\n<span class=\"line\">[...]<\/span>\r\n<span class=\"line\">  <span class=\"comment\">\/\/ Now extract the structure allocated by setupterm and free its memory<\/span><\/span>\r\n<span class=\"line\">  <span class=\"comment\">\/\/ through a really silly dance.<\/span><\/span>\r\n<span class=\"line\">  <span class=\"keyword\">struct<\/span> term *termp = set_curterm((<span class=\"keyword\">struct<\/span> term *)<span class=\"literal\">nullptr<\/span>);<\/span>\r\n<span class=\"line\">  (<span class=\"keyword\">void<\/span>)del_curterm(termp); <span class=\"comment\">\/\/ Drop any errors here.<\/span><\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u5728\u65e9\u5148\u7684\u7248\u672c\u91cc\uff0c\u8be5\u51fd\u6570\u662f\u8fd9\u6837\u5b9a\u4e49\u7684\u3002<\/p>\n<figure class=\"highlight c++\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span>\r\n<span class=\"line\">2<\/span>\r\n<span class=\"line\">3<\/span>\r\n<span class=\"line\">4<\/span>\r\n<span class=\"line\">5<\/span>\r\n<span class=\"line\">6<\/span>\r\n<span class=\"line\">7<\/span>\r\n<span class=\"line\">8<\/span>\r\n<span class=\"line\">9<\/span>\r\n<span class=\"line\">10<\/span>\r\n<span class=\"line\">11<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\"><span class=\"function\"><span class=\"keyword\">static<\/span> <span class=\"keyword\">bool<\/span> <span class=\"title\">terminalHasColors<\/span><span class=\"params\">()<\/span> <\/span>{<\/span>\r\n<span class=\"line\">  <span class=\"keyword\">if<\/span> (<span class=\"keyword\">const<\/span> <span class=\"keyword\">char<\/span> *term = <span class=\"built_in\">std<\/span>::getenv(<span class=\"string\">\"TERM\"<\/span>)) {<\/span>\r\n<span class=\"line\">    <span class=\"comment\">\/\/ Most modern terminals support ANSI escape sequences for colors.<\/span><\/span>\r\n<span class=\"line\">    <span class=\"comment\">\/\/ We could check terminfo, or have a list of known terms that support<\/span><\/span>\r\n<span class=\"line\">    <span class=\"comment\">\/\/ colors, but that would be overkill.<\/span><\/span>\r\n<span class=\"line\">    <span class=\"comment\">\/\/ The user can always ask for no colors by setting TERM to dumb, or<\/span><\/span>\r\n<span class=\"line\">    <span class=\"comment\">\/\/ using a commandline flag.<\/span><\/span>\r\n<span class=\"line\">    <span class=\"keyword\">return<\/span> <span class=\"built_in\">strcmp<\/span>(term, <span class=\"string\">\"dumb\"<\/span>) != <span class=\"number\">0<\/span>;<\/span>\r\n<span class=\"line\">  }<\/span>\r\n<span class=\"line\">  <span class=\"keyword\">return<\/span> <span class=\"literal\">false<\/span>;<\/span>\r\n<span class=\"line\">}<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p><a href=\"https:\/\/github.com\/llvm-mirror\/llvm\/commit\/d485e7bd7639cd6b39c6113a30fbc3cdc8c41c4c#diff-a4fb6575a290937bc9142e3d7efc8989\" target=\"_blank\" rel=\"external noopener noreferrer\">\u7ed9\u00a0<code>set_curterm<\/code>\u00a0\u4f20\u5165\u00a0<code>nullptr<\/code><\/a>\u00a0\u7740\u5b9e\u662f\u4e2a\u574f\u4e3b\u610f\u3002<\/p>\n<h2 id=\"\u5341\u4e5d_\u00b7_\u590d\u5199\u5185\u5b58\">\u5341\u4e5d \u00b7 \u590d\u5199\u5185\u5b58<\/h2>\n<p>\u4e3a\u4e86\u786e\u5b9a\u5acc\u7591\uff0c\u540c\u65f6\u8bd5\u7740\u770b\u770b\u6709\u6ca1\u6709\u53ef\u80fd\u7684\u4e34\u65f6\u89e3\u51b3\u65b9\u6848\uff0c\u6211\u4f1a\u5c1d\u8bd5\u5728\u5f02\u5e38\u8c03\u7528\u00a0<code>set_curterm<\/code>\u00a0\u65f6\u590d\u5199\u4fee\u6539\u5185\u5b58\u3002<\/p>\n<p>\u9996\u5148\uff0c\u6211\u4eec\u5728 GDB \u91cc\u8ddf\u8e2a\u7a0b\u5e8f\uff0c\u5e76\u5728\u00a0<code>set_curterm<\/code>\u00a0\u5904\u8bbe\u7f6e\u65ad\u70b9\uff0c\u76f4\u5230\u8c03\u7528\u5b83\u65f6\u4f20\u5165\u4e86\u00a0<code>0x0<\/code>\u00a0\u4f5c\u4e3a\u53c2\u6570\u3002<\/p>\n<figure class=\"highlight bash\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span>\r\n<span class=\"line\">2<\/span>\r\n<span class=\"line\">3<\/span>\r\n<span class=\"line\">4<\/span>\r\n<span class=\"line\">5<\/span>\r\n<span class=\"line\">6<\/span>\r\n<span class=\"line\">7<\/span>\r\n<span class=\"line\">8<\/span>\r\n<span class=\"line\">9<\/span>\r\n<span class=\"line\">10<\/span>\r\n<span class=\"line\">11<\/span>\r\n<span class=\"line\">12<\/span>\r\n<span class=\"line\">13<\/span>\r\n<span class=\"line\">14<\/span>\r\n<span class=\"line\">15<\/span>\r\n<span class=\"line\">16<\/span>\r\n<span class=\"line\">17<\/span>\r\n<span class=\"line\">18<\/span>\r\n<span class=\"line\">19<\/span>\r\n<span class=\"line\">20<\/span>\r\n<span class=\"line\">21<\/span>\r\n<span class=\"line\">22<\/span>\r\n<span class=\"line\">23<\/span>\r\n<span class=\"line\">24<\/span>\r\n<span class=\"line\">25<\/span>\r\n<span class=\"line\">26<\/span>\r\n<span class=\"line\">27<\/span>\r\n<span class=\"line\">28<\/span>\r\n<span class=\"line\">29<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\"><span class=\"comment\"># gdb `which python`<\/span><\/span>\r\n<span class=\"line\">GNU gdb (Ubuntu <span class=\"number\">7.11<\/span>.<span class=\"number\">1<\/span>-<span class=\"number\">0<\/span>ubuntu1~<span class=\"number\">16.04<\/span>) <span class=\"number\">7.11<\/span>.<span class=\"number\">1<\/span><\/span>\r\n<span class=\"line\">[...]<\/span>\r\n<span class=\"line\">(gdb) b <span class=\"built_in\">set<\/span>_curterm<\/span>\r\n<span class=\"line\">Function <span class=\"string\">\"set_curterm\"<\/span> not defined.<\/span>\r\n<span class=\"line\">Make breakpoint pending on future shared library load? (y or [n]) y<\/span>\r\n<span class=\"line\">Breakpoint <span class=\"number\">1<\/span> (<span class=\"built_in\">set<\/span>_curterm) pending.<\/span>\r\n<span class=\"line\">(gdb) r cachetop.py<\/span>\r\n<span class=\"line\">Starting program: \/usr\/bin\/python cachetop.py<\/span>\r\n<span class=\"line\">[Thread debugging using libthread_db enabled]<\/span>\r\n<span class=\"line\">Using host libthread_db library <span class=\"string\">\"\/lib\/x86_64-linux-gnu\/libthread_db.so.1\"<\/span>.<\/span>\r\n\r\n<span class=\"line\">Breakpoint <span class=\"number\">1<\/span>, <span class=\"built_in\">set<\/span>_curterm (termp=termp@entry=<span class=\"number\">0<\/span>xa43150) at \/build\/ncurses-pKZ1BN\/ncurses-<span class=\"number\">6.0<\/span>+<span class=\"number\">20160213<\/span>\/ncurses\/tinfo\/lib_cur_term.c:<span class=\"number\">80<\/span><\/span>\r\n<span class=\"line\"><span class=\"number\">80<\/span>      {<\/span>\r\n<span class=\"line\">(gdb) c<\/span>\r\n<span class=\"line\">Continuing.<\/span>\r\n\r\n<span class=\"line\">Breakpoint <span class=\"number\">1<\/span>, <span class=\"built_in\">set<\/span>_curterm (termp=termp@entry=<span class=\"number\">0<\/span>xab5870) at \/build\/ncurses-pKZ1BN\/ncurses-<span class=\"number\">6.0<\/span>+<span class=\"number\">20160213<\/span>\/ncurses\/tinfo\/lib_cur_term.c:<span class=\"number\">80<\/span><\/span>\r\n<span class=\"line\"><span class=\"number\">80<\/span>      {<\/span>\r\n<span class=\"line\">(gdb) c<\/span>\r\n<span class=\"line\">Continuing.<\/span>\r\n\r\n<span class=\"line\">Breakpoint <span class=\"number\">1<\/span>, <span class=\"built_in\">set<\/span>_curterm (termp=termp@entry=<span class=\"number\">0<\/span>xbecb90) at \/build\/ncurses-pKZ1BN\/ncurses-<span class=\"number\">6.0<\/span>+<span class=\"number\">20160213<\/span>\/ncurses\/tinfo\/lib_cur_term.c:<span class=\"number\">80<\/span><\/span>\r\n<span class=\"line\"><span class=\"number\">80<\/span>      {<\/span>\r\n<span class=\"line\">(gdb) c<\/span>\r\n<span class=\"line\">Continuing.<\/span>\r\n\r\n<span class=\"line\">Breakpoint <span class=\"number\">1<\/span>, <span class=\"built_in\">set<\/span>_curterm (termp=<span class=\"number\">0<\/span>x0) at \/build\/ncurses-pKZ1BN\/ncurses-<span class=\"number\">6.0<\/span>+<span class=\"number\">20160213<\/span>\/ncurses\/tinfo\/lib_cur_term.c:<span class=\"number\">80<\/span><\/span>\r\n<span class=\"line\"><span class=\"number\">80<\/span>      {<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u6b64\u65f6\uff0c\u6211\u8981\u4f7f\u7528\u00a0<code>set<\/code>\u00a0\u547d\u4ee4\uff0c\u590d\u5199\u76f8\u5173\u7684\u5185\u5b58\uff1a\u4f7f\u7528\u4e4b\u524d\u4f20\u5165\u00a0<code>set_curterm<\/code>\u00a0\u5e76\u6b63\u786e\u6267\u884c\u7684\u53c2\u6570\u00a0<code>0xbecb90<\/code>\u00a0\u66ff\u4ee3\u00a0<code>0x0<\/code>\u2014\u2014\u5f53\u7136\uff0c\u5e0c\u671b\u8fd9\u4e00\u5730\u5740\u4ecd\u65e7\u662f\u5408\u6cd5\u7684\u3002<\/p>\n<p><strong>\u8b66\u544a<\/strong>\uff0c\u590d\u5199\u5185\u5b58\u662f\u5341\u5206\u5371\u9669\u7684\uff01GDB \u4e0d\u4f1a\u5411\u4f60\u786e\u8ba4\uff0c\u300c\u4f60\u786e\u5b9a\u5417\u300d\u3002\u5982\u679c\u4f60\u641e\u9519\u4e86\uff0c\u6216\u8005\u8f93\u5165\u65f6\u624b\u6ed1\u4e86\uff0c\u90a3\u4e48\u8fdb\u7a0b\u5c31\u4f1a\u5d29\u6e83\u3002\u597d\u4e00\u70b9\u7684\u60c5\u51b5\uff0c\u8fdb\u7a0b\u5f53\u65f6\u5c31\u5d29\u6e83\u4e86\u3002\u7cdf\u7cd5\u7684\u60c5\u51b5\uff0c\u53ef\u80fd\u5728\u5982\u679c\u6309\u65f6\u95f4\u540e\u624d\u5d29\u6e83\uff0c\u800c\u8c01\u4e5f\u4e0d\u77e5\u9053\u662f\u600e\u4e48\u4e86\u3002<\/p>\n<p>\u6b64\u5904\uff0c\u6211\u662f\u5728\u4e00\u53f0\u8bd5\u9a8c\u7528\u673a\u5668\u4e0a\u8fdb\u884c\u8c03\u8bd5\u3002\u56e0\u4e3a\u6ca1\u6709\u654f\u611f\u6570\u636e\uff0c\u6240\u4ee5\u6211\u5192\u9669\u4e00\u8bd5\u3002\u6b64\u5904\uff0c\u6211\u5c06\u7528\u00a0<code>p\/x<\/code>\u00a0\u4ee5\u5341\u516d\u8fdb\u5236\u7684\u5f62\u5f0f\u6253\u5370\u5bc4\u5b58\u5668\u00a0<code>%rdi<\/code>\u00a0\u4e2d\u7684\u5185\u5bb9\uff0c\u5e76\u7528\u00a0<code>set<\/code>\u00a0\u547d\u4ee4\u5c06\u5176\u8bbe\u7f6e\u4e3a\u4e4b\u524d\u53ef\u7528\u7684\u503c\uff0c\u5e76\u68c0\u67e5\u5bc4\u5b58\u5668\u72b6\u6001\u3002<\/p>\n<figure class=\"highlight bash\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span>\r\n<span class=\"line\">2<\/span>\r\n<span class=\"line\">3<\/span>\r\n<span class=\"line\">4<\/span>\r\n<span class=\"line\">5<\/span>\r\n<span class=\"line\">6<\/span>\r\n<span class=\"line\">7<\/span>\r\n<span class=\"line\">8<\/span>\r\n<span class=\"line\">9<\/span>\r\n<span class=\"line\">10<\/span>\r\n<span class=\"line\">11<\/span>\r\n<span class=\"line\">12<\/span>\r\n<span class=\"line\">13<\/span>\r\n<span class=\"line\">14<\/span>\r\n<span class=\"line\">15<\/span>\r\n<span class=\"line\">16<\/span>\r\n<span class=\"line\">17<\/span>\r\n<span class=\"line\">18<\/span>\r\n<span class=\"line\">19<\/span>\r\n<span class=\"line\">20<\/span>\r\n<span class=\"line\">21<\/span>\r\n<span class=\"line\">22<\/span>\r\n<span class=\"line\">23<\/span>\r\n<span class=\"line\">24<\/span>\r\n<span class=\"line\">25<\/span>\r\n<span class=\"line\">26<\/span>\r\n<span class=\"line\">27<\/span>\r\n<span class=\"line\">28<\/span>\r\n<span class=\"line\">29<\/span>\r\n<span class=\"line\">30<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\">(gdb) p\/x <span class=\"variable\">$rdi<\/span><\/span>\r\n<span class=\"line\"><span class=\"variable\">$1<\/span> = <span class=\"number\">0<\/span>x0<\/span>\r\n<span class=\"line\">(gdb) <span class=\"built_in\">set<\/span> <span class=\"variable\">$rdi<\/span>=<span class=\"number\">0<\/span>xbecb90<\/span>\r\n<span class=\"line\">(gdb) p\/x <span class=\"variable\">$rdi<\/span><\/span>\r\n<span class=\"line\"><span class=\"variable\">$2<\/span> = <span class=\"number\">0<\/span>xbecb90<\/span>\r\n<span class=\"line\">(gdb) i r<\/span>\r\n<span class=\"line\">rax            <span class=\"number\">0<\/span>x100    <span class=\"number\">256<\/span><\/span>\r\n<span class=\"line\">rbx            <span class=\"number\">0<\/span>x1  <span class=\"number\">1<\/span><\/span>\r\n<span class=\"line\">rcx            <span class=\"number\">0<\/span>xe71    <span class=\"number\">3697<\/span><\/span>\r\n<span class=\"line\">rdx            <span class=\"number\">0<\/span>x0  <span class=\"number\">0<\/span><\/span>\r\n<span class=\"line\">rsi            <span class=\"number\">0<\/span>x7ffff5dd45d3   <span class=\"number\">140737318307283<\/span><\/span>\r\n<span class=\"line\">rdi            <span class=\"number\">0<\/span>xbecb90 <span class=\"number\">12503952<\/span><\/span>\r\n<span class=\"line\">rbp            <span class=\"number\">0<\/span>x100    <span class=\"number\">0<\/span>x100<\/span>\r\n<span class=\"line\">rsp            <span class=\"number\">0<\/span>x7fffffffa5b8   <span class=\"number\">0<\/span>x7fffffffa5b8<\/span>\r\n<span class=\"line\">r8             <span class=\"number\">0<\/span>xbf0050 <span class=\"number\">12517456<\/span><\/span>\r\n<span class=\"line\">r9             <span class=\"number\">0<\/span>x1999999999999999   <span class=\"number\">1844674407370955161<\/span><\/span>\r\n<span class=\"line\">r10            <span class=\"number\">0<\/span>xbf0040 <span class=\"number\">12517440<\/span><\/span>\r\n<span class=\"line\">r11            <span class=\"number\">0<\/span>x7ffff7bb4b78   <span class=\"number\">140737349634936<\/span><\/span>\r\n<span class=\"line\">r12            <span class=\"number\">0<\/span>xbecb70 <span class=\"number\">12503920<\/span><\/span>\r\n<span class=\"line\">r13            <span class=\"number\">0<\/span>xbeaea0 <span class=\"number\">12496544<\/span><\/span>\r\n<span class=\"line\">r14            <span class=\"number\">0<\/span>x7fffffffa9a0   <span class=\"number\">140737488333216<\/span><\/span>\r\n<span class=\"line\">r15            <span class=\"number\">0<\/span>x7fffffffa8a0   <span class=\"number\">140737488332960<\/span><\/span>\r\n<span class=\"line\">rip            <span class=\"number\">0<\/span>x7ffff3c76a80   <span class=\"number\">0<\/span>x7ffff3c76a80 &lt;<span class=\"built_in\">set<\/span>_curterm&gt;<\/span>\r\n<span class=\"line\">eflags         <span class=\"number\">0<\/span>x246    [ PF ZF IF ]<\/span>\r\n<span class=\"line\">cs             <span class=\"number\">0<\/span>x33 <span class=\"number\">51<\/span><\/span>\r\n<span class=\"line\">ss             <span class=\"number\">0<\/span>x2b <span class=\"number\">43<\/span><\/span>\r\n<span class=\"line\">ds             <span class=\"number\">0<\/span>x0  <span class=\"number\">0<\/span><\/span>\r\n<span class=\"line\">es             <span class=\"number\">0<\/span>x0  <span class=\"number\">0<\/span><\/span>\r\n<span class=\"line\">fs             <span class=\"number\">0<\/span>x0  <span class=\"number\">0<\/span><\/span>\r\n<span class=\"line\">gs             <span class=\"number\">0<\/span>x0  <span class=\"number\">0<\/span><\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\uff08\u5f53\u7136\uff0c\u56e0\u4e3a\u6709\u8c03\u8bd5\u4fe1\u606f\uff0c\u6240\u4ee5\u6211\u672c\u6ca1\u5fc5\u8981\u76f4\u63a5\u64cd\u4f5c\u5bc4\u5b58\u5668\u00a0<code>%rdi<\/code>\u00a0\u7684\u503c\uff0c\u6211\u53ef\u4ee5\u76f4\u63a5\u8bbe\u7f6e\u51fd\u6570\u53c2\u6570\u00a0<code>termp<\/code>\u00a0\u7684\u503c\uff09<\/p>\n<p>\u73b0\u5728\u00a0<code>%rdi<\/code>\u00a0\u7684\u503c\u5df2\u7ecf\u66f4\u65b0\uff0c\u5176\u4ed6\u5bc4\u5b58\u5668\u770b\u4e0a\u53bb\u4e5f\u6ca1\u4ec0\u4e48\u95ee\u9898\u3002\u4e8e\u662f\u6211\u4eec\u8ba9\u7a0b\u5e8f\u7ee7\u7eed\u6267\u884c\u3002<\/p>\n<figure class=\"highlight bash\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span>\r\n<span class=\"line\">2<\/span>\r\n<span class=\"line\">3<\/span>\r\n<span class=\"line\">4<\/span>\r\n<span class=\"line\">5<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\">(gdb) c<\/span>\r\n<span class=\"line\">Continuing.<\/span>\r\n\r\n<span class=\"line\">Breakpoint <span class=\"number\">1<\/span>, <span class=\"built_in\">set<\/span>_curterm (termp=termp@entry=<span class=\"number\">0<\/span>x0) at \/build\/ncurses-pKZ1BN\/ncurses-<span class=\"number\">6.0<\/span>+<span class=\"number\">20160213<\/span>\/ncurses\/tinfo\/lib_cur_term.c:<span class=\"number\">80<\/span><\/span>\r\n<span class=\"line\"><span class=\"number\">80<\/span>  {<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u8d5e\uff01\u5f53\u524d\u5bf9\u00a0<code>set_curterm<\/code>\u00a0\u7684\u8c03\u7528\u901a\u8fc7\u4e86\uff0c\u6ca1\u6709\u5f15\u53d1\u6bb5\u9519\u8bef\u3002\u4e0d\u8fc7\uff0c\u4e0b\u4e00\u6b21\u8c03\u7528\u00a0<code>set_curterm<\/code>\u00a0\u53c8\u4f20\u5165\u4e86\u00a0<code>0x0<\/code>\uff0c\u6211\u4eec\u6545\u6280\u91cd\u65bd\u3002<\/p>\n<figure class=\"highlight bash\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span>\r\n<span class=\"line\">2<\/span>\r\n<span class=\"line\">3<\/span>\r\n<span class=\"line\">4<\/span>\r\n<span class=\"line\">5<\/span>\r\n<span class=\"line\">6<\/span>\r\n<span class=\"line\">7<\/span>\r\n<span class=\"line\">8<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\">(gdb) <span class=\"built_in\">set<\/span> <span class=\"variable\">$rdi<\/span>=<span class=\"number\">0<\/span>xbecb90<\/span>\r\n<span class=\"line\">(gdb) c<\/span>\r\n<span class=\"line\">Continuing.<\/span>\r\n<span class=\"line\">warning: JITed object file architecture unknown is not compatible with target architecture i386:x86-<span class=\"number\">64<\/span>.<\/span>\r\n\r\n<span class=\"line\">Program received signal SIGSEGV, Segmentation fault.<\/span>\r\n<span class=\"line\"><span class=\"number\">0<\/span>x00007ffff34ad411 <span class=\"keyword\">in<\/span> ClrBlank (win=<span class=\"number\">0<\/span>xaea060) at \/build\/ncurses-pKZ1BN\/ncurses-<span class=\"number\">6.0<\/span>+<span class=\"number\">20160213<\/span>\/ncurses\/tty\/tty_update.c:<span class=\"number\">1129<\/span><\/span>\r\n<span class=\"line\"><span class=\"number\">1129<\/span>        <span class=\"keyword\">if<\/span> (back_color_erase)<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u554a\u54c8\uff01\u8fd9\u6b21\u4fee\u6539\u5185\u5b58\u5f97\u5230\u4e86\u53e6\u4e00\u4e2a\u6bb5\u9519\u8bef\u3002\u4e0d\u8fc7\uff0c\u867d\u7136\u5982\u6b64\uff0c\u5f53\u524d\u7684\u95ee\u9898\u81f3\u5c11\u662f\u89e3\u51b3\u4e86\u3002<\/p>\n<h2 id=\"\u4e8c\u5341_\u00b7_\u6761\u4ef6\u65ad\u70b9\">\u4e8c\u5341 \u00b7 \u6761\u4ef6\u65ad\u70b9<\/h2>\n<p>\u5728\u4e4b\u524d\u7684\u7ae0\u8282\u4e2d\uff0c\u6211\u4e0d\u5f97\u4e0d\u8fde\u7eed\u4f7f\u7528 3 \u6b21\u00a0<code>continue<\/code>\u00a0\u4ee5\u4fbf\u5230\u8fbe\u6211\u771f\u6b63\u611f\u5174\u8da3\u7684\u90a3\u6b21\u51fd\u6570\u8c03\u7528\u3002\u5982\u679c\u76f8\u5173\u51fd\u6570\u88ab\u8c03\u7528\u4e86\u4e0a\u767e\u6b21\uff0c\u90a3\u4e48\u6211\u4f1a\u8003\u8651\u4f7f\u7528\u6761\u4ef6\u65ad\u70b9\u3002\u4ee5\u4e0b\u662f\u4e00\u4e2a\u793a\u4f8b\u3002<\/p>\n<p>\u9996\u5148\uff0c\u6211\u4f1a\u5982\u5e38\u542f\u52a8\u7a0b\u5e8f\u5e76\u672a\u00a0<code>set_curterm<\/code>\u00a0\u8bbe\u7f6e\u65ad\u70b9\u3002<\/p>\n<figure class=\"highlight bash\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span>\r\n<span class=\"line\">2<\/span>\r\n<span class=\"line\">3<\/span>\r\n<span class=\"line\">4<\/span>\r\n<span class=\"line\">5<\/span>\r\n<span class=\"line\">6<\/span>\r\n<span class=\"line\">7<\/span>\r\n<span class=\"line\">8<\/span>\r\n<span class=\"line\">9<\/span>\r\n<span class=\"line\">10<\/span>\r\n<span class=\"line\">11<\/span>\r\n<span class=\"line\">12<\/span>\r\n<span class=\"line\">13<\/span>\r\n<span class=\"line\">14<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\"><span class=\"comment\"># gdb `which python`<\/span><\/span>\r\n<span class=\"line\">GNU gdb (Ubuntu <span class=\"number\">7.11<\/span>.<span class=\"number\">1<\/span>-<span class=\"number\">0<\/span>ubuntu1~<span class=\"number\">16.04<\/span>) <span class=\"number\">7.11<\/span>.<span class=\"number\">1<\/span><\/span>\r\n<span class=\"line\">[...]<\/span>\r\n<span class=\"line\">(gdb) b <span class=\"built_in\">set<\/span>_curterm<\/span>\r\n<span class=\"line\">Function <span class=\"string\">\"set_curterm\"<\/span> not defined.<\/span>\r\n<span class=\"line\">Make breakpoint pending on future shared library load? (y or [n]) y<\/span>\r\n<span class=\"line\">Breakpoint <span class=\"number\">1<\/span> (<span class=\"built_in\">set<\/span>_curterm) pending.<\/span>\r\n<span class=\"line\">(gdb) r cachetop.py<\/span>\r\n<span class=\"line\">Starting program: \/usr\/bin\/python cachetop.py<\/span>\r\n<span class=\"line\">[Thread debugging using libthread_db enabled]<\/span>\r\n<span class=\"line\">Using host libthread_db library <span class=\"string\">\"\/lib\/x86_64-linux-gnu\/libthread_db.so.1\"<\/span>.<\/span>\r\n\r\n<span class=\"line\">Breakpoint <span class=\"number\">1<\/span>, <span class=\"built_in\">set<\/span>_curterm (termp=termp@entry=<span class=\"number\">0<\/span>xa43150) at \/build\/ncurses-pKZ1BN\/ncurses-<span class=\"number\">6.0<\/span>+<span class=\"number\">20160213<\/span>\/ncurses\/tinfo\/lib_cur_term.c:<span class=\"number\">80<\/span><\/span>\r\n<span class=\"line\"><span class=\"number\">80<\/span>  {<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u73b0\u5728\uff0c\u6211\u8981\u5c06\u65ad\u70b9 1 \u8f6c\u6362\u4e3a\u6761\u4ef6\u65ad\u70b9\uff0c\u4f7f\u5176\u53ea\u5728\u00a0<code>%rdi<\/code>\u00a0\u7684\u503c\u4e3a\u00a0<code>0x0<\/code>\u00a0\u65f6\u751f\u6548\u3002<\/p>\n<figure class=\"highlight bash\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span>\r\n<span class=\"line\">2<\/span>\r\n<span class=\"line\">3<\/span>\r\n<span class=\"line\">4<\/span>\r\n<span class=\"line\">5<\/span>\r\n<span class=\"line\">6<\/span>\r\n<span class=\"line\">7<\/span>\r\n<span class=\"line\">8<\/span>\r\n<span class=\"line\">9<\/span>\r\n<span class=\"line\">10<\/span>\r\n<span class=\"line\">11<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\">(gdb) cond <span class=\"number\">1<\/span> <span class=\"variable\">$rdi<\/span>==<span class=\"number\">0<\/span>x0<\/span>\r\n<span class=\"line\">(gdb) i b<\/span>\r\n<span class=\"line\">Num     Type           Disp Enb Address            What<\/span>\r\n<span class=\"line\"><span class=\"number\">1<\/span>       breakpoint     keep y   <span class=\"number\">0<\/span>x00007ffff3c76a80 <span class=\"keyword\">in<\/span> <span class=\"built_in\">set<\/span>_curterm at \/build\/ncurses-pKZ1BN\/ncurses-<span class=\"number\">6.0<\/span>+<span class=\"number\">20160213<\/span>\/ncurses\/tinfo\/lib_cur_term.c:<span class=\"number\">80<\/span><\/span>\r\n<span class=\"line\">    stop only <span class=\"keyword\">if<\/span> <span class=\"variable\">$rdi<\/span>==<span class=\"number\">0<\/span>x0<\/span>\r\n<span class=\"line\">    breakpoint already hit <span class=\"number\">1<\/span> time<\/span>\r\n<span class=\"line\">(gdb) c<\/span>\r\n<span class=\"line\">Continuing.<\/span>\r\n\r\n<span class=\"line\">Breakpoint <span class=\"number\">1<\/span>, <span class=\"built_in\">set<\/span>_curterm (termp=<span class=\"number\">0<\/span>x0) at \/build\/ncurses-pKZ1BN\/ncurses-<span class=\"number\">6.0<\/span>+<span class=\"number\">20160213<\/span>\/ncurses\/tinfo\/lib_cur_term.c:<span class=\"number\">80<\/span><\/span>\r\n<span class=\"line\">(gdb)<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u543c\u554a\uff01\u901a\u8fc7\u4f7f\u7528\u00a0<code>cond<\/code>\u00a0(<code>conditional<\/code>)\uff0c\u6211\u5c06\u65ad\u70b9 1 \u8bbe\u7f6e\u4e3a\u6761\u4ef6\u65ad\u70b9\u3002\u56e0\u6b64\uff0c\u5f53\u65ad\u70b9 1 \u4e0b\u4e00\u6b21\u751f\u6548\u65f6\uff0c\u5c31\u662f\u00a0<code>set_curterm<\/code>\u00a0\u63a5\u53d7\u7684\u7b2c\u4e00\u4e2a\u53c2\u6570\u503c\u4e3a\u00a0<code>0x0<\/code>\u00a0\u7684\u65f6\u5019\u3002\u6b64\u5916\uff0c\u6211\u7528\u4e86\u00a0<code>i b<\/code>\u00a0(<code>info breakpoints<\/code>) \u5217\u51fa\u4e86\u6240\u6709\u65ad\u70b9\u7684\u4fe1\u606f\u3002<\/p>\n<p>\u8fd9\u91cc\u9700\u8981\u8003\u8651\uff0c\u4e3a\u4ec0\u4e48\u6211\u4e0d\u5728\u8bbe\u7f6e\u65ad\u70b9\u540e\u7684\u7b2c\u4e00\u65f6\u95f4\u5c31\u5c06\u5176\u8bbe\u7f6e\u4e3a\u6761\u4ef6\u65ad\u70b9\u3002\u8fd9\u662f\u56e0\u4e3a\uff0c\u6211\u53d1\u73b0\u5bf9\u4e8e\u7a0b\u5e8f\u5c1a\u672a\u6267\u884c\u65f6\u8bbe\u7f6e\u7684\u88ab\u5ef6\u8fdf\u7684\u65ad\u70b9\u6765\u8bf4\uff0c\u8fd9\u4e9b\u6761\u4ef6\u4e0d\u4f1a\u751f\u6548\u2014\u2014\u81f3\u5c11\u5f53\u524d\u7684 GDB \u7248\u672c\u662f\u8fd9\u6837\u3002\uff08\u4e5f\u6709\u53ef\u80fd\u662f\u6211\u641e\u9519\u4e86\uff09<\/p>\n<h2 id=\"\u5eff\u4e00_\u00b7_\u76f4\u63a5\u8fd4\u56de\">\u5eff\u4e00 \u00b7 \u76f4\u63a5\u8fd4\u56de<\/h2>\n<p>\u6211\u4e5f\u66fe\u5c1d\u8bd5\u4e86\u53e6\u4e00\u4e2a\u548c\u590d\u5199\u5185\u5b58\u7c7b\u4f3c\u7684\u65b9\u6848\u3002\u4e0d\u8fc7\uff0c\u8fd9\u6b21\u6211\u4e0d\u6253\u7b97\u4fee\u6539\u5185\u5b58\u4e2d\u7684\u6570\u636e\uff0c\u800c\u662f\u4fee\u6539\u6307\u4ee4\u3002<\/p>\n<p><strong>\u8b66\u544a<\/strong>\uff1a\u5148\u524d\u7684\u8b66\u544a\u5728\u6b64\u5904\u540c\u6837\u9002\u7528\u3002<\/p>\n<p>\u6211\u5c06\u5982\u5148\u524d\u4e00\u6837\uff0c\u505c\u5728\u00a0<code>set_curterm<\/code>\u00a0\u7684\u00a0<code>0x0<\/code>\u00a0\u8c03\u7528\u5904\uff0c\u800c\u540e\u9002\u7528 GDB \u7684\u00a0<code>ret<\/code>\u00a0(<code>return<\/code>) \u547d\u4ee4\u8df3\u8fc7\u51fd\u6570\u7684\u6267\u884c\uff0c\u76f4\u63a5\u8fd4\u56de\u3002\u6b64\u5904\u7684\u8003\u91cf\u662f\uff0c\u5982\u679c\u51fd\u6570\u672a\u6267\u884c\uff0c\u5219\u5168\u5c40\u53d8\u91cf\u00a0<code>curterm<\/code>\u00a0\u4e0d\u4f1a\u88ab\u8bbe\u7f6e\u4e3a\u00a0<code>0x0<\/code>\u3002<\/p>\n<figure class=\"highlight bash\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span>\r\n<span class=\"line\">2<\/span>\r\n<span class=\"line\">3<\/span>\r\n<span class=\"line\">4<\/span>\r\n<span class=\"line\">5<\/span>\r\n<span class=\"line\">6<\/span>\r\n<span class=\"line\">7<\/span>\r\n<span class=\"line\">8<\/span>\r\n<span class=\"line\">9<\/span>\r\n<span class=\"line\">10<\/span>\r\n<span class=\"line\">11<\/span>\r\n<span class=\"line\">12<\/span>\r\n<span class=\"line\">13<\/span>\r\n<span class=\"line\">14<\/span>\r\n<span class=\"line\">15<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\">[...]<\/span>\r\n<span class=\"line\">(gdb) c<\/span>\r\n<span class=\"line\">Continuing.<\/span>\r\n\r\n<span class=\"line\">Breakpoint <span class=\"number\">1<\/span>, <span class=\"built_in\">set<\/span>_curterm (termp=<span class=\"number\">0<\/span>x0) at \/build\/ncurses-pKZ1BN\/ncurses-<span class=\"number\">6.0<\/span>+<span class=\"number\">20160213<\/span>\/ncurses\/tinfo\/lib_cur_term.c:<span class=\"number\">80<\/span><\/span>\r\n\r\n<span class=\"line\">(gdb) ret<\/span>\r\n<span class=\"line\">Make <span class=\"built_in\">set<\/span>_curterm <span class=\"built_in\">return<\/span> now? (y or n) y<\/span>\r\n<span class=\"line\"><span class=\"comment\">#0  0x00007ffff5a44e75 in llvm::sys::Process::FileDescriptorHasColors(int) () from \/usr\/lib\/x86_64-linux-gnu\/libbcc.so.0<\/span><\/span>\r\n<span class=\"line\">(gdb) c<\/span>\r\n<span class=\"line\">Continuing.<\/span>\r\n\r\n<span class=\"line\">Program received signal SIGSEGV, Segmentation fault.<\/span>\r\n<span class=\"line\">                                                    _nc_free_termtype (ptr=ptr@entry=<span class=\"number\">0<\/span>x100) at \/build\/ncurses-pKZ1BN\/ncurses-<span class=\"number\">6.0<\/span>+<span class=\"number\">20160213<\/span>\/ncurses\/tinfo\/free_ttype.c:<span class=\"number\">52<\/span><\/span>\r\n<span class=\"line\"><span class=\"number\">52<\/span>      FreeIfNeeded(ptr-&gt;str_table);<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u597d\u561b\uff0c\u8fdb\u7a0b\u53c8\u6302\u4e86\u2026\u2026\u8fd9\u662f\u8fdb\u7a0b\u5d29\u6389\u4e4b\u540e\u7684\u72b6\u6001\u3002<\/p>\n<p>\u5ea6\u8fc7\u66f4\u591a\u4ee3\u7801\u4e4b\u540e\uff0c\u6211\u51b3\u5b9a\u518d\u8bd5\u8bd5\u770b\u3002\u6211\u60f3\u8bd5\u7740\u8fde\u7eed\u6267\u884c\u4e24\u6b21\u00a0<code>ret<\/code>\uff0c\u4ee5\u514d\u00a0<code>set_curterm<\/code>\u00a0\u7684\u8c03\u7528\u8005\u88ab\u4e0d\u5b8c\u6574\u7684\u8c03\u7528\u641e\u574f\u4e86\u3002\u518d\u6b21\u5f3a\u8c03\uff1a\u8fd9\u53ea\u662f\u4e00\u4e2a\u975e\u5e38 hacky \u7684\u5b9e\u9a8c\uff0c\u5728\u751f\u4ea7\u73af\u5883\u4e2d\u8bf7\u614e\u91cd\u6267\u884c\u3002<\/p>\n<figure class=\"highlight bash\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span>\r\n<span class=\"line\">2<\/span>\r\n<span class=\"line\">3<\/span>\r\n<span class=\"line\">4<\/span>\r\n<span class=\"line\">5<\/span>\r\n<span class=\"line\">6<\/span>\r\n<span class=\"line\">7<\/span>\r\n<span class=\"line\">8<\/span>\r\n<span class=\"line\">9<\/span>\r\n<span class=\"line\">10<\/span>\r\n<span class=\"line\">11<\/span>\r\n<span class=\"line\">12<\/span>\r\n<span class=\"line\">13<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\">[...]<\/span>\r\n<span class=\"line\">(gdb) c<\/span>\r\n<span class=\"line\">Continuing.<\/span>\r\n\r\n<span class=\"line\">Breakpoint <span class=\"number\">1<\/span>, <span class=\"built_in\">set<\/span>_curterm (termp=<span class=\"number\">0<\/span>x0) at \/build\/ncurses-pKZ1BN\/ncurses-<span class=\"number\">6.0<\/span>+<span class=\"number\">20160213<\/span>\/ncurses\/tinfo\/lib_cur_term.c:<span class=\"number\">80<\/span><\/span>\r\n<span class=\"line\"><span class=\"number\">80<\/span>  {<\/span>\r\n<span class=\"line\">(gdb) ret<\/span>\r\n<span class=\"line\">Make <span class=\"built_in\">set<\/span>_curterm <span class=\"built_in\">return<\/span> now? (y or n) y<\/span>\r\n<span class=\"line\"><span class=\"comment\">#0  0x00007ffff5a44e75 in llvm::sys::Process::FileDescriptorHasColors(int) () from \/usr\/lib\/x86_64-linux-gnu\/libbcc.so.0<\/span><\/span>\r\n<span class=\"line\">(gdb) ret<\/span>\r\n<span class=\"line\">Make selected stack frame <span class=\"built_in\">return<\/span> now? (y or n) y<\/span>\r\n<span class=\"line\"><span class=\"comment\">#0  0x00007ffff45cabb8 in clang::driver::tools::Clang::ConstructJob(clang::driver::Compilation&amp;, clang::driver::JobAction const&amp;, clang::driver::InputInfo const&amp;, llvm::SmallVector const&amp;, llvm::opt::ArgList const&amp;, char const*) const () from \/usr\/lib\/x86_64-linux-gnu\/libbcc.so.0<\/span><\/span>\r\n<span class=\"line\">(gdb) c<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u8fd9\u56de\uff0c\u6574\u4e2a\u5c4f\u5e55\u90fd\u767d\u4e86\uff0c\u7136\u540e\u505c\u4f4f\u2026\u2026\u4e4b\u540e\u663e\u793a\u51fa\u4e86\u5982\u4e0b\u7ed3\u679c\u3002<\/p>\n<figure class=\"highlight bash\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span>\r\n<span class=\"line\">2<\/span>\r\n<span class=\"line\">3<\/span>\r\n<span class=\"line\">4<\/span>\r\n<span class=\"line\">5<\/span>\r\n<span class=\"line\">6<\/span>\r\n<span class=\"line\">7<\/span>\r\n<span class=\"line\">8<\/span>\r\n<span class=\"line\">9<\/span>\r\n<span class=\"line\">10<\/span>\r\n<span class=\"line\">11<\/span>\r\n<span class=\"line\">12<\/span>\r\n<span class=\"line\">13<\/span>\r\n<span class=\"line\">14<\/span>\r\n<span class=\"line\">15<\/span>\r\n<span class=\"line\">16<\/span>\r\n<span class=\"line\">17<\/span>\r\n<span class=\"line\">18<\/span>\r\n<span class=\"line\">19<\/span>\r\n<span class=\"line\">20<\/span>\r\n<span class=\"line\">21<\/span>\r\n<span class=\"line\">22<\/span>\r\n<span class=\"line\">23<\/span>\r\n<span class=\"line\">24<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\"><span class=\"number\">07<\/span>:<span class=\"number\">44<\/span>:<span class=\"number\">22<\/span> Buffers MB: <span class=\"number\">61<\/span> \/ Cached MB: <span class=\"number\">1246<\/span><\/span>\r\n<span class=\"line\">PID      UID      CMD              HITS     MISSES   DIRTIES  READ_HIT%  WRITE_HIT%<\/span>\r\n<span class=\"line\">    <span class=\"number\">2742<\/span> root     systemd-logind          <span class=\"number\">3<\/span>       <span class=\"number\">66<\/span>        <span class=\"number\">2<\/span>       <span class=\"number\">1.4<\/span>%      <span class=\"number\">95.7<\/span>%<\/span>\r\n<span class=\"line\">   <span class=\"number\">15836<\/span> root     kworker\/u30:<span class=\"number\">1<\/span>           <span class=\"number\">7<\/span>        <span class=\"number\">0<\/span>        <span class=\"number\">1<\/span>      <span class=\"number\">85.7<\/span>%       <span class=\"number\">0.0<\/span>%<\/span>\r\n<span class=\"line\">    <span class=\"number\">2736<\/span> messageb dbus-daemon             <span class=\"number\">8<\/span>       <span class=\"number\">66<\/span>        <span class=\"number\">2<\/span>       <span class=\"number\">8.1<\/span>%      <span class=\"number\">89.2<\/span>%<\/span>\r\n<span class=\"line\">       <span class=\"number\">1<\/span> root     systemd                <span class=\"number\">15<\/span>        <span class=\"number\">0<\/span>        <span class=\"number\">0<\/span>     <span class=\"number\">100.0<\/span>%       <span class=\"number\">0.0<\/span>%<\/span>\r\n<span class=\"line\">    <span class=\"number\">2812<\/span> syslog   rs:main Q:Reg          <span class=\"number\">16<\/span>       <span class=\"number\">66<\/span>        <span class=\"number\">8<\/span>       <span class=\"number\">9.8<\/span>%      <span class=\"number\">80.5<\/span>%<\/span>\r\n<span class=\"line\">     <span class=\"number\">435<\/span> root     systemd-journal        <span class=\"number\">32<\/span>       <span class=\"number\">66<\/span>        <span class=\"number\">8<\/span>      <span class=\"number\">24.5<\/span>%      <span class=\"number\">67.3<\/span>%<\/span>\r\n<span class=\"line\">    <span class=\"number\">2740<\/span> root     accounts-daemon       <span class=\"number\">113<\/span>       <span class=\"number\">66<\/span>        <span class=\"number\">2<\/span>      <span class=\"number\">62.0<\/span>%      <span class=\"number\">36.9<\/span>%<\/span>\r\n<span class=\"line\">   <span class=\"number\">15847<\/span> root     bash                  <span class=\"number\">160<\/span>        <span class=\"number\">0<\/span>        <span class=\"number\">1<\/span>      <span class=\"number\">99.4<\/span>%       <span class=\"number\">0.0<\/span>%<\/span>\r\n<span class=\"line\">   <span class=\"number\">15864<\/span> root     lesspipe              <span class=\"number\">306<\/span>        <span class=\"number\">0<\/span>        <span class=\"number\">2<\/span>      <span class=\"number\">99.3<\/span>%       <span class=\"number\">0.0<\/span>%<\/span>\r\n<span class=\"line\">   <span class=\"number\">15854<\/span> root     bash                  <span class=\"number\">309<\/span>        <span class=\"number\">0<\/span>        <span class=\"number\">2<\/span>      <span class=\"number\">99.4<\/span>%       <span class=\"number\">0.0<\/span>%<\/span>\r\n<span class=\"line\">   <span class=\"number\">15856<\/span> root     bash                  <span class=\"number\">309<\/span>        <span class=\"number\">0<\/span>        <span class=\"number\">2<\/span>      <span class=\"number\">99.4<\/span>%       <span class=\"number\">0.0<\/span>%<\/span>\r\n<span class=\"line\">   <span class=\"number\">15866<\/span> root     bash                  <span class=\"number\">309<\/span>        <span class=\"number\">0<\/span>        <span class=\"number\">2<\/span>      <span class=\"number\">99.4<\/span>%       <span class=\"number\">0.0<\/span>%<\/span>\r\n<span class=\"line\">   <span class=\"number\">15867<\/span> root     bash                  <span class=\"number\">309<\/span>        <span class=\"number\">0<\/span>        <span class=\"number\">2<\/span>      <span class=\"number\">99.4<\/span>%       <span class=\"number\">0.0<\/span>%<\/span>\r\n<span class=\"line\">   <span class=\"number\">15860<\/span> root     bash                  <span class=\"number\">313<\/span>        <span class=\"number\">0<\/span>        <span class=\"number\">2<\/span>      <span class=\"number\">99.4<\/span>%       <span class=\"number\">0.0<\/span>%<\/span>\r\n<span class=\"line\">   <span class=\"number\">15868<\/span> root     bash                  <span class=\"number\">341<\/span>        <span class=\"number\">0<\/span>        <span class=\"number\">2<\/span>      <span class=\"number\">99.4<\/span>%       <span class=\"number\">0.0<\/span>%<\/span>\r\n<span class=\"line\">   <span class=\"number\">15858<\/span> root     uname                 <span class=\"number\">452<\/span>        <span class=\"number\">0<\/span>        <span class=\"number\">2<\/span>      <span class=\"number\">99.6<\/span>%       <span class=\"number\">0.0<\/span>%<\/span>\r\n<span class=\"line\">   <span class=\"number\">15858<\/span> root     bash                  <span class=\"number\">453<\/span>        <span class=\"number\">0<\/span>        <span class=\"number\">2<\/span>      <span class=\"number\">99.6<\/span>%       <span class=\"number\">0.0<\/span>%<\/span>\r\n<span class=\"line\">   <span class=\"number\">15866<\/span> root     dircolors             <span class=\"number\">464<\/span>        <span class=\"number\">0<\/span>        <span class=\"number\">2<\/span>      <span class=\"number\">99.6<\/span>%       <span class=\"number\">0.0<\/span>%<\/span>\r\n<span class=\"line\">   <span class=\"number\">15861<\/span> root     basename              <span class=\"number\">465<\/span>        <span class=\"number\">0<\/span>        <span class=\"number\">2<\/span>      <span class=\"number\">99.6<\/span>%       <span class=\"number\">0.0<\/span>%<\/span>\r\n<span class=\"line\">   <span class=\"number\">15864<\/span> root     dirname               <span class=\"number\">468<\/span>        <span class=\"number\">0<\/span>        <span class=\"number\">2<\/span>      <span class=\"number\">99.6<\/span>%       <span class=\"number\">0.0<\/span>%<\/span>\r\n<span class=\"line\">   <span class=\"number\">15856<\/span> root     ls                    <span class=\"number\">476<\/span>        <span class=\"number\">0<\/span>        <span class=\"number\">2<\/span>      <span class=\"number\">99.6<\/span>%       <span class=\"number\">0.0<\/span>%<\/span>\r\n<span class=\"line\">[...]<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u5e05\uff01\u70b8\uff01\u641e\u5b9a\u5566\uff01<\/p>\n<h2 id=\"\u5eff\u4e8c_\u00b7_\u66f4\u597d\u7684\u65b9\u6848\">\u5eff\u4e8c \u00b7 \u66f4\u597d\u7684\u65b9\u6848<\/h2>\n<p>\u6211\u5c06\u8c03\u8bd5\u8fc7\u7a0b\u7684\u7ed3\u679c\u63d0\u4ea4\u5728\u00a0<a href=\"https:\/\/github.com\/iovisor\/bcc\/pull\/615\" target=\"_blank\" rel=\"external noopener noreferrer\">github<\/a>\u00a0\u4e0a\u3002\u8fd9\u662f\u56e0\u4e3a\uff0c\u4e00\u65b9\u9762 BPF \u7684\u9996\u5e2d\u5de5\u7a0b\u5e08 Alexei Starovoitov \u4e5f\u662f llvm \u65b9\u9762\u7684\u4e13\u5bb6\uff0c\u53e6\u4e00\u65b9\u9762\u8fd9\u4e2a\u95ee\u9898\u7684\u6839\u6e90\u4f3c\u4e4e\u662f llvm \u7684\u4e00\u4e2a bug\u3002\u5f53\u6211\u5728\u628a\u6307\u4ee4\u548c\u6570\u636e\u641e\u5f97\u4e71\u4e03\u516b\u7cdf\u65f6\uff0c\u4ed6\u5efa\u8bae\u6211\u5728\u7f16\u8bd1\u00a0<code>bcc<\/code>\u00a0\u65f6\u52a0\u5165 llvm \u7684\u53c2\u6570\u00a0<code>-fno-color-diagnostics<\/code>\u00a0\u5373\u53ef\u7ed5\u8fc7\u8fd9\u4e00\u95ee\u9898\u3002\u641e\u5b9a\uff01\u8fd9\u786e\u5b9e\u80fd\u89e3\u51b3\u95ee\u9898\u3002\u56e0\u6b64\u6211\u5c06\u5176\u52a0\u5165\u4e86\u00a0<code>bcc<\/code>\u00a0\u7684\u4ee3\u7801\u5e93\u4f5c\u4e3a\u6682\u65f6\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u5e76\u671f\u5f85 llvm \u89e3\u51b3\u8fd9\u4e2a bug\u3002<\/p>\n<h2 id=\"\u5eff\u4e09_\u00b7_\u5173\u4e8e_Python_\u7684\u73af\u5883\">\u5eff\u4e09 \u00b7 \u5173\u4e8e Python \u7684\u73af\u5883<\/h2>\n<p>\u81f3\u6b64\uff0c\u6211\u4eec\u5df2\u7ecf\u89e3\u51b3\u4e86\u95ee\u9898\u3002\u4e0d\u8fc7\uff0c\uff08\u8bd1\u6ce8\uff1a\u6709\u5f3a\u8feb\u75c7\u7684\uff09\u4f60\u53ef\u80fd\u8fd8\u60f3\u8981\u8ba9\u6574\u4e2a\u8c03\u7528\u6808\u770b\u8d77\u6765\u5b8c\u597d\u3002<\/p>\n<p>\u4e3a\u6b64\uff0c\u4f60\u9700\u8981\u5b89\u88c5\u00a0<code>python-dbg<\/code>\u00a0\u8f6f\u4ef6\u5305\u3002<\/p>\n<figure class=\"highlight bash\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span>\r\n<span class=\"line\">2<\/span>\r\n<span class=\"line\">3<\/span>\r\n<span class=\"line\">4<\/span>\r\n<span class=\"line\">5<\/span>\r\n<span class=\"line\">6<\/span>\r\n<span class=\"line\">7<\/span>\r\n<span class=\"line\">8<\/span>\r\n<span class=\"line\">9<\/span>\r\n<span class=\"line\">10<\/span>\r\n<span class=\"line\">11<\/span>\r\n<span class=\"line\">12<\/span>\r\n<span class=\"line\">13<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\"><span class=\"comment\"># apt-get install -y python-dbg<\/span><\/span>\r\n<span class=\"line\">Reading package lists... Done<\/span>\r\n<span class=\"line\">[...]<\/span>\r\n<span class=\"line\">The following additional packages will be installed:<\/span>\r\n<span class=\"line\">  libpython-dbg libpython2.<span class=\"number\">7<\/span>-dbg python2.<span class=\"number\">7<\/span>-dbg<\/span>\r\n<span class=\"line\">Suggested packages:<\/span>\r\n<span class=\"line\">  python2.<span class=\"number\">7<\/span>-gdbm-dbg python2.<span class=\"number\">7<\/span>-tk-dbg python-gdbm-dbg python-tk-dbg<\/span>\r\n<span class=\"line\">The following NEW packages will be installed:<\/span>\r\n<span class=\"line\">  libpython-dbg libpython2.<span class=\"number\">7<\/span>-dbg python-dbg python2.<span class=\"number\">7<\/span>-dbg<\/span>\r\n<span class=\"line\"><span class=\"number\">0<\/span> upgraded, <span class=\"number\">4<\/span> newly installed, <span class=\"number\">0<\/span> to remove and <span class=\"number\">20<\/span> not upgraded.<\/span>\r\n<span class=\"line\">Need to get <span class=\"number\">11.9<\/span> MB of archives.<\/span>\r\n<span class=\"line\">After this operation, <span class=\"number\">36.4<\/span> MB of additional disk space will be used.<\/span>\r\n<span class=\"line\">[...]<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u6b64\u65f6\uff0c\u518d\u6253\u5f00 GDB \u770b\u770b\u8c03\u7528\u6808\u3002<\/p>\n<figure class=\"highlight bash\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span>\r\n<span class=\"line\">2<\/span>\r\n<span class=\"line\">3<\/span>\r\n<span class=\"line\">4<\/span>\r\n<span class=\"line\">5<\/span>\r\n<span class=\"line\">6<\/span>\r\n<span class=\"line\">7<\/span>\r\n<span class=\"line\">8<\/span>\r\n<span class=\"line\">9<\/span>\r\n<span class=\"line\">10<\/span>\r\n<span class=\"line\">11<\/span>\r\n<span class=\"line\">12<\/span>\r\n<span class=\"line\">13<\/span>\r\n<span class=\"line\">14<\/span>\r\n<span class=\"line\">15<\/span>\r\n<span class=\"line\">16<\/span>\r\n<span class=\"line\">17<\/span>\r\n<span class=\"line\">18<\/span>\r\n<span class=\"line\">19<\/span>\r\n<span class=\"line\">20<\/span>\r\n<span class=\"line\">21<\/span>\r\n<span class=\"line\">22<\/span>\r\n<span class=\"line\">23<\/span>\r\n<span class=\"line\">24<\/span>\r\n<span class=\"line\">25<\/span>\r\n<span class=\"line\">26<\/span>\r\n<span class=\"line\">27<\/span>\r\n<span class=\"line\">28<\/span>\r\n<span class=\"line\">29<\/span>\r\n<span class=\"line\">30<\/span>\r\n<span class=\"line\">31<\/span>\r\n<span class=\"line\">32<\/span>\r\n<span class=\"line\">33<\/span>\r\n<span class=\"line\">34<\/span>\r\n<span class=\"line\">35<\/span>\r\n<span class=\"line\">36<\/span>\r\n<span class=\"line\">37<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\"><span class=\"comment\"># gdb `which python` \/var\/cores\/core.python.30520<\/span><\/span>\r\n<span class=\"line\">GNU gdb (Ubuntu <span class=\"number\">7.11<\/span>.<span class=\"number\">1<\/span>-<span class=\"number\">0<\/span>ubuntu1~<span class=\"number\">16.04<\/span>) <span class=\"number\">7.11<\/span>.<span class=\"number\">1<\/span><\/span>\r\n<span class=\"line\">[...]<\/span>\r\n<span class=\"line\">Reading symbols from \/usr\/bin\/python...Reading symbols from \/usr\/lib\/debug\/.build-id\/<span class=\"number\">4<\/span>e\/a0539215b2a9e32602f81c90240874132c1a54.debug...done.<\/span>\r\n<span class=\"line\">[...]<\/span>\r\n<span class=\"line\">(gdb) bt<\/span>\r\n<span class=\"line\"><span class=\"comment\">#0  ClrBlank (win=0x1993060) at \/build\/ncurses-pKZ1BN\/ncurses-6.0+20160213\/ncurses\/tty\/tty_update.c:1129<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#1  ClrUpdate () at \/build\/ncurses-pKZ1BN\/ncurses-6.0+20160213\/ncurses\/tty\/tty_update.c:1147<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#2  doupdate () at \/build\/ncurses-pKZ1BN\/ncurses-6.0+20160213\/ncurses\/tty\/tty_update.c:1010<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#3  0x00007f0a37aa07e6 in wrefresh (win=win@entry=0x1993060) at \/build\/ncurses-pKZ1BN\/ncurses-6.0+20160213\/ncurses\/base\/lib_refresh.c:65<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#4  0x00007f0a37a99499 in recur_wrefresh (win=win@entry=0x1993060) at \/build\/ncurses-pKZ1BN\/ncurses-6.0+20160213\/ncurses\/base\/lib_getch.c:384<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#5  0x00007f0a37a99616 in _nc_wgetch (win=win@entry=0x1993060, result=result@entry=0x7ffd33d93e24, use_meta=1)<\/span><\/span>\r\n<span class=\"line\">    at \/build\/ncurses-pKZ1BN\/ncurses-<span class=\"number\">6.0<\/span>+<span class=\"number\">20160213<\/span>\/ncurses\/base\/lib_getch.c:<span class=\"number\">491<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#6  0x00007f0a37a9a325 in wgetch (win=0x1993060) at \/build\/ncurses-pKZ1BN\/ncurses-6.0+20160213\/ncurses\/base\/lib_getch.c:672<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#7  0x00007f0a37cc6ec3 in PyCursesWindow_GetCh.lto_priv.109 (self=0x7f0a3c57b198, args=()) at \/build\/python2.7-HpIZBG\/python2.7-2.7.11\/Modules\/_cursesmodule.c:853<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#8  0x00000000004c4d5a in call_function (oparg=&lt;optimized out&gt;, pp_stack=0x7ffd33d93f30) at ..\/Python\/ceval.c:4350<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#9  PyEval_EvalFrameEx () at ..\/Python\/ceval.c:2987<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#10 0x00000000004c2e05 in PyEval_EvalCodeEx () at ..\/Python\/ceval.c:3582<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#11 0x00000000004def08 in function_call.lto_priv () at ..\/Objects\/funcobject.c:523<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#12 0x00000000004b1153 in PyObject_Call () at ..\/Objects\/abstract.c:2546<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#13 0x00000000004c73ec in ext_do_call (nk=0, na=&lt;optimized out&gt;, flags=&lt;optimized out&gt;, pp_stack=0x7ffd33d941e8, func=&lt;function at remote 0x7f0a37edcc80&gt;)<\/span><\/span>\r\n<span class=\"line\">    at ..\/Python\/ceval.c:<span class=\"number\">4662<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#14 PyEval_EvalFrameEx () at ..\/Python\/ceval.c:3026<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#15 0x00000000004c2e05 in PyEval_EvalCodeEx () at ..\/Python\/ceval.c:3582<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#16 0x00000000004caf42 in fast_function (nk=0, na=&lt;optimized out&gt;, n=&lt;optimized out&gt;, pp_stack=0x7ffd33d943f0, func=&lt;function at remote 0x7f0a38039140&gt;)<\/span><\/span>\r\n<span class=\"line\">    at ..\/Python\/ceval.c:<span class=\"number\">4445<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#17 call_function (oparg=&lt;optimized out&gt;, pp_stack=0x7ffd33d943f0) at ..\/Python\/ceval.c:4370<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#18 PyEval_EvalFrameEx () at ..\/Python\/ceval.c:2987<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#19 0x00000000004c2e05 in PyEval_EvalCodeEx () at ..\/Python\/ceval.c:3582<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#20 0x00000000004c2ba9 in PyEval_EvalCode (co=&lt;optimized out&gt;, globals=&lt;optimized out&gt;, locals=&lt;optimized out&gt;) at ..\/Python\/ceval.c:669<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#21 0x00000000004f20ef in run_mod.lto_priv () at ..\/Python\/pythonrun.c:1376<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#22 0x00000000004eca72 in PyRun_FileExFlags () at ..\/Python\/pythonrun.c:1362<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#23 0x00000000004eb1f1 in PyRun_SimpleFileExFlags () at ..\/Python\/pythonrun.c:948<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#24 0x000000000049e18a in Py_Main () at ..\/Modules\/main.c:640<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#25 0x00007f0a3be10830 in __libc_start_main (main=0x49daf0 &lt;main&gt;, argc=2, argv=0x7ffd33d94838, init=&lt;optimized out&gt;, fini=&lt;optimized out&gt;, rtld_fini=&lt;optimized out&gt;,<\/span><\/span>\r\n<span class=\"line\">    stack_end=<span class=\"number\">0<\/span>x7ffd33d94828) at ..\/csu\/libc-start.c:<span class=\"number\">291<\/span><\/span>\r\n<span class=\"line\"><span class=\"comment\">#26 0x000000000049da19 in _start ()<\/span><\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u6b64\u65f6\uff0c\u6240\u6709\u7684\u00a0<code>??<\/code>\u00a0\u90fd\u4e0d\u89c1\u4e86\uff0c\u7136\u800c\u5bf9\u89e3\u51b3\u6211\u4eec\u7684\u95ee\u9898\u5e76\u6ca1\u6709\u4ec0\u4e48 X \u7528\u2026\u2026<\/p>\n<p>\u6b64\u5916\uff0cPython \u8c03\u8bd5\u8f6f\u4ef6\u5305\u8fd8\u52a0\u5f3a\u4e86 GDB \u7684\u529f\u80fd\u3002\u6211\u4eec\u73b0\u5728\u53ef\u4ee5\u770b\u770b Python \u7684\u8c03\u7528\u6808\u3002<\/p>\n<figure class=\"highlight bash\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span>\r\n<span class=\"line\">2<\/span>\r\n<span class=\"line\">3<\/span>\r\n<span class=\"line\">4<\/span>\r\n<span class=\"line\">5<\/span>\r\n<span class=\"line\">6<\/span>\r\n<span class=\"line\">7<\/span>\r\n<span class=\"line\">8<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\">(gdb) py-bt<\/span>\r\n<span class=\"line\">Traceback (most recent call first):<\/span>\r\n<span class=\"line\">  File <span class=\"string\">\".\/cachetop.py\"<\/span>, line <span class=\"number\">188<\/span>, <span class=\"keyword\">in<\/span> handle_loop<\/span>\r\n<span class=\"line\">    s = stdscr.getch()<\/span>\r\n<span class=\"line\">  File <span class=\"string\">\"\/usr\/lib\/python2.7\/curses\/wrapper.py\"<\/span>, line <span class=\"number\">43<\/span>, <span class=\"keyword\">in<\/span> wrapper<\/span>\r\n<span class=\"line\">    <span class=\"built_in\">return<\/span> func(stdscr, *args, **kwds)<\/span>\r\n<span class=\"line\">  File <span class=\"string\">\".\/cachetop.py\"<\/span>, line <span class=\"number\">260<\/span>, <span class=\"keyword\">in<\/span><\/span>\r\n<span class=\"line\">    curses.wrapper(handle_loop, args)<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u4ee5\u53ca\uff0c\u6211\u4eec\u53ef\u4ee5\u770b\u770b Python \u4ee3\u7801\u662f\u600e\u6837\u7684\u3002<\/p>\n<figure class=\"highlight bash\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span>\r\n<span class=\"line\">2<\/span>\r\n<span class=\"line\">3<\/span>\r\n<span class=\"line\">4<\/span>\r\n<span class=\"line\">5<\/span>\r\n<span class=\"line\">6<\/span>\r\n<span class=\"line\">7<\/span>\r\n<span class=\"line\">8<\/span>\r\n<span class=\"line\">9<\/span>\r\n<span class=\"line\">10<\/span>\r\n<span class=\"line\">11<\/span>\r\n<span class=\"line\">12<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\">(gdb) py-list<\/span>\r\n<span class=\"line\"> <span class=\"number\">183<\/span>        b.attach_kprobe(event=<span class=\"string\">\"mark_buffer_dirty\"<\/span>, fn_name=<span class=\"string\">\"do_count\"<\/span>)<\/span>\r\n<span class=\"line\"> <span class=\"number\">184<\/span><\/span>\r\n<span class=\"line\"> <span class=\"number\">185<\/span>        exiting = <span class=\"number\">0<\/span><\/span>\r\n<span class=\"line\"> <span class=\"number\">186<\/span><\/span>\r\n<span class=\"line\"> <span class=\"number\">187<\/span>        <span class=\"keyword\">while<\/span> <span class=\"number\">1<\/span>:<\/span>\r\n<span class=\"line\">&gt;<span class=\"number\">188<\/span>            s = stdscr.getch()<\/span>\r\n<span class=\"line\"> <span class=\"number\">189<\/span>            <span class=\"keyword\">if<\/span> s == ord(<span class=\"string\">'q'<\/span>):<\/span>\r\n<span class=\"line\"> <span class=\"number\">190<\/span>                exiting = <span class=\"number\">1<\/span><\/span>\r\n<span class=\"line\"> <span class=\"number\">191<\/span>            <span class=\"keyword\">elif<\/span> s == ord(<span class=\"string\">'r'<\/span>):<\/span>\r\n<span class=\"line\"> <span class=\"number\">192<\/span>                sort_reverse = not sort_reverse<\/span>\r\n<span class=\"line\"> <span class=\"number\">193<\/span>            <span class=\"keyword\">elif<\/span> s == ord(<span class=\"string\">'&lt;'<\/span>):<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u8fd9\u80fd\u6307\u51fa\uff0c\u5728\u6211\u4eec\u7684 Python \u4ee3\u7801\u4e2d\uff0c\u7a76\u7adf\u662f\u90a3\u4e00\u884c\u89e6\u53d1\u4e86\u6bb5\u9519\u8bef\u3002\u8fd9\u770b\u8d77\u6765\u975e\u5e38\u68d2\uff01<\/p>\n<p>\u4e4b\u524d\u6211\u4eec\u5728\u56de\u6eaf\u8c03\u7528\u6808\u65f6\u9047\u5230\u7684\u95ee\u9898\uff0c\u5176\u539f\u56e0\u5728\u4e8e\u6211\u4eec\u770b\u5230\u4e86 Python \u5185\u90e8\u5728\u6267\u884c\u7684\u65b9\u6cd5\uff08methods\uff09\uff0c\u4f46\u5374\u770b\u4e0d\u5230\u5bf9\u5e94\u65b9\u6cd5\u7684\u7b26\u53f7\u3002\u5982\u679c\u4f60\u5728\u8c03\u8bd5\u522b\u7684\u8bed\u8a00\uff0c\u7c7b\u4f3c\u7684\u95ee\u9898\u53d6\u51b3\u4e8e\u5b83\u7684\u7f16\u8bd1\u9009\u9879\u548c\u8fd0\u884c\u73af\u5883\uff0c\u4ee5\u53ca\u6267\u884c\u4ee3\u7801\u662f\u5982\u4f55\u7ed3\u675f\u7684\u3002\u5982\u679c\u4f60\u5728\u7f51\u4e0a\u68c0\u7d22\u300c\u8bed\u8a00\u540d GDB\u300d\uff0c\u4f60\u53ef\u80fd\u4f1a\u627e\u5230\u7c7b\u4f3c\u00a0<code>python-dbg<\/code>\u00a0\u8fd9\u6837\u7684\u6269\u5c55\u3002\u5982\u679c\u6ca1\u6709\u7684\u8bdd\uff0c\u574f\u6d88\u606f\u662f\u4f60\u5fc5\u987b\u81ea\u5df1\u5199\u8fd9\u6837\u7684\u8f6f\u4ef6\u5305\uff0c\u4f46\u597d\u6d88\u606f\u662f\u8fd9\u6837\u505a\u662f\u53ef\u884c\u7684\u3002\u5982\u679c\u4f60\u662f\u5728\u8c03\u8bd5 Python\uff0c\u90a3\u4e48\u8bf7\u5728\u7f51\u4e0a\u68c0\u7d22\u300cadd new GDB commands in Pyhon\u300d\u3002<\/p>\n<h2 id=\"\u5eff\u56db_\u00b7_\u66f4\u591a\u2026\u2026\">\u5eff\u56db \u00b7 \u66f4\u591a\u2026\u2026<\/h2>\n<p>\u770b\u8d77\u6765\uff0c\u6211\u4f3c\u4e4e\u662f\u8981\u5199\u4e00\u4e2a\u5b8c\u6574\u7684 GDB \u6307\u5357\uff0c\u4f46\u663e\u7136\u6211\u4e0d\u662f\uff1aGDB \u8fd8\u6709\u5f88\u591a\u6211\u6ca1\u8bb2\u5230\u7684\u4e1c\u897f\u3002\u4f60\u53ef\u4ee5\u5728 GDB \u4e2d\u4f7f\u7528\u00a0<code>help<\/code>\u00a0\u547d\u4ee4\uff0c\u5206\u95e8\u522b\u7c7b\u67e5\u770b GDB \u7684\u5176\u4ed6\u529f\u80fd\u3002<\/p>\n<figure class=\"highlight bash\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span>\r\n<span class=\"line\">2<\/span>\r\n<span class=\"line\">3<\/span>\r\n<span class=\"line\">4<\/span>\r\n<span class=\"line\">5<\/span>\r\n<span class=\"line\">6<\/span>\r\n<span class=\"line\">7<\/span>\r\n<span class=\"line\">8<\/span>\r\n<span class=\"line\">9<\/span>\r\n<span class=\"line\">10<\/span>\r\n<span class=\"line\">11<\/span>\r\n<span class=\"line\">12<\/span>\r\n<span class=\"line\">13<\/span>\r\n<span class=\"line\">14<\/span>\r\n<span class=\"line\">15<\/span>\r\n<span class=\"line\">16<\/span>\r\n<span class=\"line\">17<\/span>\r\n<span class=\"line\">18<\/span>\r\n<span class=\"line\">19<\/span>\r\n<span class=\"line\">20<\/span>\r\n<span class=\"line\">21<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\">(gdb) <span class=\"built_in\">help<\/span><\/span>\r\n<span class=\"line\">List of classes of commands:<\/span>\r\n\r\n<span class=\"line\">aliases -- Aliases of other commands<\/span>\r\n<span class=\"line\">breakpoints -- Making program stop at certain points<\/span>\r\n<span class=\"line\">data -- Examining data<\/span>\r\n<span class=\"line\">files -- Specifying and examining files<\/span>\r\n<span class=\"line\">internals -- Maintenance commands<\/span>\r\n<span class=\"line\">obscure -- Obscure features<\/span>\r\n<span class=\"line\">running -- Running the program<\/span>\r\n<span class=\"line\">stack -- Examining the stack<\/span>\r\n<span class=\"line\">status -- Status inquiries<\/span>\r\n<span class=\"line\">support -- Support facilities<\/span>\r\n<span class=\"line\">tracepoints -- Tracing of program execution without stopping the program<\/span>\r\n<span class=\"line\">user-defined -- User-defined commands<\/span>\r\n\r\n<span class=\"line\">Type <span class=\"string\">\"help\"<\/span> followed by a class name <span class=\"keyword\">for<\/span> a list of commands <span class=\"keyword\">in<\/span> that class.<\/span>\r\n<span class=\"line\">Type <span class=\"string\">\"help all\"<\/span> <span class=\"keyword\">for<\/span> the list of all commands.<\/span>\r\n<span class=\"line\">Type <span class=\"string\">\"help\"<\/span> followed by <span class=\"built_in\">command<\/span> name <span class=\"keyword\">for<\/span> full documentation.<\/span>\r\n<span class=\"line\">Type <span class=\"string\">\"apropos word\"<\/span> to search <span class=\"keyword\">for<\/span> commands related to <span class=\"string\">\"word\"<\/span>.<\/span>\r\n<span class=\"line\">Command name abbreviations are allowed <span class=\"keyword\">if<\/span> unambiguous.<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u5bf9\u4e8e\u5177\u4f53\u67d0\u4e2a\u547d\u4ee4\u6765\u8bf4\uff0c\u4f60\u4e5f\u53ef\u4ee5\u7528\u00a0<code>help<\/code>\u00a0\u547d\u4ee4\u67e5\u770b\u5177\u4f53\u7528\u6cd5\u3002\u4f8b\u5982\u8bf4\uff0c\u4f60\u53ef\u4ee5\u67e5\u770b\u6240\u6709\u548c\u00a0<code>breakpoints<\/code>\u00a0\u76f8\u5173\u7684\u547d\u4ee4\u3002<\/p>\n<figure class=\"highlight bash\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre><span class=\"line\">1<\/span>\r\n<span class=\"line\">2<\/span>\r\n<span class=\"line\">3<\/span>\r\n<span class=\"line\">4<\/span>\r\n<span class=\"line\">5<\/span>\r\n<span class=\"line\">6<\/span>\r\n<span class=\"line\">7<\/span>\r\n<span class=\"line\">8<\/span>\r\n<span class=\"line\">9<\/span>\r\n<span class=\"line\">10<\/span>\r\n<span class=\"line\">11<\/span>\r\n<span class=\"line\">12<\/span>\r\n<span class=\"line\">13<\/span>\r\n<span class=\"line\">14<\/span>\r\n<span class=\"line\">15<\/span>\r\n<span class=\"line\">16<\/span>\r\n<span class=\"line\">17<\/span>\r\n<span class=\"line\">18<\/span>\r\n<span class=\"line\">19<\/span>\r\n<span class=\"line\">20<\/span>\r\n<span class=\"line\">21<\/span>\r\n<span class=\"line\">22<\/span>\r\n<span class=\"line\">23<\/span>\r\n<span class=\"line\">24<\/span>\r\n<span class=\"line\">25<\/span>\r\n<span class=\"line\">26<\/span>\r\n<span class=\"line\">27<\/span>\r\n<span class=\"line\">28<\/span>\r\n<span class=\"line\">29<\/span>\r\n<span class=\"line\">30<\/span>\r\n<span class=\"line\">31<\/span>\r\n<span class=\"line\">32<\/span>\r\n<span class=\"line\">33<\/span>\r\n<span class=\"line\">34<\/span>\r\n<span class=\"line\">35<\/span>\r\n<span class=\"line\">36<\/span>\r\n<span class=\"line\">37<\/span>\r\n<span class=\"line\">38<\/span>\r\n<span class=\"line\">39<\/span>\r\n<span class=\"line\">40<\/span>\r\n<span class=\"line\">41<\/span>\r\n<span class=\"line\">42<\/span>\r\n<span class=\"line\">43<\/span>\r\n<span class=\"line\">44<\/span>\r\n<span class=\"line\">45<\/span>\r\n<span class=\"line\">46<\/span>\r\n<span class=\"line\">47<\/span>\r\n<span class=\"line\">48<\/span>\r\n<span class=\"line\">49<\/span>\r\n<span class=\"line\">50<\/span>\r\n<span class=\"line\">51<\/span>\r\n<span class=\"line\">52<\/span>\r\n<span class=\"line\">53<\/span>\r\n<span class=\"line\">54<\/span>\r\n<span class=\"line\">55<\/span>\r\n<span class=\"line\">56<\/span>\r\n<span class=\"line\">57<\/span>\r\n<span class=\"line\">58<\/span>\r\n<span class=\"line\">59<\/span>\r\n<span class=\"line\">60<\/span>\r\n<span class=\"line\">61<\/span>\r\n<span class=\"line\">62<\/span>\r\n<span class=\"line\">63<\/span>\r\n<span class=\"line\">64<\/span>\r\n<span class=\"line\">65<\/span>\r\n<span class=\"line\">66<\/span>\r\n<span class=\"line\">67<\/span>\r\n<span class=\"line\">68<\/span>\r\n<span class=\"line\">69<\/span>\r\n<span class=\"line\">70<\/span>\r\n<span class=\"line\">71<\/span>\r\n<span class=\"line\">72<\/span>\r\n<span class=\"line\">73<\/span>\r\n<span class=\"line\">74<\/span>\r\n<span class=\"line\">75<\/span>\r\n<span class=\"line\">76<\/span>\r\n<span class=\"line\">77<\/span>\r\n<span class=\"line\">78<\/span>\r\n<span class=\"line\">79<\/span>\r\n<span class=\"line\">80<\/span>\r\n<span class=\"line\">81<\/span>\r\n<span class=\"line\">82<\/span>\r\n<span class=\"line\">83<\/span>\r\n<span class=\"line\">84<\/span>\r\n<span class=\"line\">85<\/span>\r\n<span class=\"line\">86<\/span>\r\n<span class=\"line\">87<\/span>\r\n<span class=\"line\">88<\/span>\r\n<span class=\"line\">89<\/span>\r\n<span class=\"line\">90<\/span>\r\n<span class=\"line\">91<\/span>\r\n<span class=\"line\">92<\/span>\r\n<span class=\"line\">93<\/span>\r\n<span class=\"line\">94<\/span>\r\n<span class=\"line\">95<\/span>\r\n<span class=\"line\">96<\/span>\r\n<span class=\"line\">97<\/span>\r\n<span class=\"line\">98<\/span><\/pre>\n<\/td>\n<td class=\"code\">\n<pre><span class=\"line\">(gdb) <span class=\"built_in\">help<\/span> breakpoints<\/span>\r\n<span class=\"line\">Making program stop at certain points.<\/span>\r\n\r\n<span class=\"line\">List of commands:<\/span>\r\n\r\n<span class=\"line\">awatch -- Set a watchpoint <span class=\"keyword\">for<\/span> an expression<\/span>\r\n<span class=\"line\"><span class=\"built_in\">break<\/span> -- Set breakpoint at specified location<\/span>\r\n<span class=\"line\"><span class=\"built_in\">break<\/span>-range -- Set a breakpoint <span class=\"keyword\">for<\/span> an address range<\/span>\r\n<span class=\"line\">catch -- Set catchpoints to catch events<\/span>\r\n<span class=\"line\">catch assert -- Catch failed Ada assertions<\/span>\r\n<span class=\"line\">catch catch -- Catch an exception<\/span>\r\n<span class=\"line\">catch exception -- Catch Ada exceptions<\/span>\r\n<span class=\"line\">catch <span class=\"built_in\">exec<\/span> -- Catch calls to <span class=\"built_in\">exec<\/span><\/span>\r\n<span class=\"line\">catch fork -- Catch calls to fork<\/span>\r\n<span class=\"line\">catch load -- Catch loads of shared libraries<\/span>\r\n<span class=\"line\">catch rethrow -- Catch an exception<\/span>\r\n<span class=\"line\">catch signal -- Catch signals by their names and\/or numbers<\/span>\r\n<span class=\"line\">catch syscall -- Catch system calls by their names and\/or numbers<\/span>\r\n<span class=\"line\">catch throw -- Catch an exception<\/span>\r\n<span class=\"line\">catch unload -- Catch unloads of shared libraries<\/span>\r\n<span class=\"line\">catch vfork -- Catch calls to vfork<\/span>\r\n<span class=\"line\">clear -- Clear breakpoint at specified location<\/span>\r\n<span class=\"line\">commands -- Set commands to be executed when a breakpoint is hit<\/span>\r\n<span class=\"line\">condition -- Specify breakpoint number N to <span class=\"built_in\">break<\/span> only <span class=\"keyword\">if<\/span> COND is <span class=\"literal\">true<\/span><\/span>\r\n<span class=\"line\">delete -- Delete some breakpoints or auto-display expressions<\/span>\r\n<span class=\"line\">delete bookmark -- Delete a bookmark from the bookmark list<\/span>\r\n<span class=\"line\">delete breakpoints -- Delete some breakpoints or auto-display expressions<\/span>\r\n<span class=\"line\">delete checkpoint -- Delete a checkpoint (experimental)<\/span>\r\n<span class=\"line\">delete display -- Cancel some expressions to be displayed when program stops<\/span>\r\n<span class=\"line\">delete mem -- Delete memory region<\/span>\r\n<span class=\"line\">delete tracepoints -- Delete specified tracepoints<\/span>\r\n<span class=\"line\">delete tvariable -- Delete one or more trace state variables<\/span>\r\n<span class=\"line\"><span class=\"built_in\">disable<\/span> -- Disable some breakpoints<\/span>\r\n<span class=\"line\"><span class=\"built_in\">disable<\/span> breakpoints -- Disable some breakpoints<\/span>\r\n<span class=\"line\"><span class=\"built_in\">disable<\/span> display -- Disable some expressions to be displayed when program stops<\/span>\r\n<span class=\"line\"><span class=\"built_in\">disable<\/span> frame-filter -- GDB <span class=\"built_in\">command<\/span> to <span class=\"built_in\">disable<\/span> the specified frame-filter<\/span>\r\n<span class=\"line\"><span class=\"built_in\">disable<\/span> mem -- Disable memory region<\/span>\r\n<span class=\"line\"><span class=\"built_in\">disable<\/span> pretty-printer -- GDB <span class=\"built_in\">command<\/span> to <span class=\"built_in\">disable<\/span> the specified pretty-printer<\/span>\r\n<span class=\"line\"><span class=\"built_in\">disable<\/span> probes -- Disable probes<\/span>\r\n<span class=\"line\"><span class=\"built_in\">disable<\/span> tracepoints -- Disable specified tracepoints<\/span>\r\n<span class=\"line\"><span class=\"built_in\">disable<\/span> <span class=\"built_in\">type<\/span>-printer -- GDB <span class=\"built_in\">command<\/span> to <span class=\"built_in\">disable<\/span> the specified <span class=\"built_in\">type<\/span>-printer<\/span>\r\n<span class=\"line\"><span class=\"built_in\">disable<\/span> unwinder -- GDB <span class=\"built_in\">command<\/span> to <span class=\"built_in\">disable<\/span> the specified unwinder<\/span>\r\n<span class=\"line\"><span class=\"built_in\">disable<\/span> xmethod -- GDB <span class=\"built_in\">command<\/span> to <span class=\"built_in\">disable<\/span> a specified (group of) xmethod(s)<\/span>\r\n<span class=\"line\">dprintf -- Set a dynamic <span class=\"built_in\">printf<\/span> at specified location<\/span>\r\n<span class=\"line\"><span class=\"built_in\">enable<\/span> -- Enable some breakpoints<\/span>\r\n<span class=\"line\"><span class=\"built_in\">enable<\/span> breakpoints -- Enable some breakpoints<\/span>\r\n<span class=\"line\"><span class=\"built_in\">enable<\/span> breakpoints count -- Enable breakpoints <span class=\"keyword\">for<\/span> COUNT hits<\/span>\r\n<span class=\"line\"><span class=\"built_in\">enable<\/span> breakpoints delete -- Enable breakpoints and delete when hit<\/span>\r\n<span class=\"line\"><span class=\"built_in\">enable<\/span> breakpoints once -- Enable breakpoints <span class=\"keyword\">for<\/span> one hit<\/span>\r\n<span class=\"line\"><span class=\"built_in\">enable<\/span> count -- Enable breakpoints <span class=\"keyword\">for<\/span> COUNT hits<\/span>\r\n<span class=\"line\"><span class=\"built_in\">enable<\/span> delete -- Enable breakpoints and delete when hit<\/span>\r\n<span class=\"line\"><span class=\"built_in\">enable<\/span> display -- Enable some expressions to be displayed when program stops<\/span>\r\n<span class=\"line\"><span class=\"built_in\">enable<\/span> frame-filter -- GDB <span class=\"built_in\">command<\/span> to <span class=\"built_in\">disable<\/span> the specified frame-filter<\/span>\r\n<span class=\"line\"><span class=\"built_in\">enable<\/span> mem -- Enable memory region<\/span>\r\n<span class=\"line\"><span class=\"built_in\">enable<\/span> once -- Enable breakpoints <span class=\"keyword\">for<\/span> one hit<\/span>\r\n<span class=\"line\"><span class=\"built_in\">enable<\/span> pretty-printer -- GDB <span class=\"built_in\">command<\/span> to <span class=\"built_in\">enable<\/span> the specified pretty-printer<\/span>\r\n<span class=\"line\"><span class=\"built_in\">enable<\/span> probes -- Enable probes<\/span>\r\n<span class=\"line\"><span class=\"built_in\">enable<\/span> tracepoints -- Enable specified tracepoints<\/span>\r\n<span class=\"line\"><span class=\"built_in\">enable<\/span> <span class=\"built_in\">type<\/span>-printer -- GDB <span class=\"built_in\">command<\/span> to <span class=\"built_in\">enable<\/span> the specified <span class=\"built_in\">type<\/span> printer<\/span>\r\n<span class=\"line\"><span class=\"built_in\">enable<\/span> unwinder -- GDB <span class=\"built_in\">command<\/span> to <span class=\"built_in\">enable<\/span> unwinders<\/span>\r\n<span class=\"line\"><span class=\"built_in\">enable<\/span> xmethod -- GDB <span class=\"built_in\">command<\/span> to <span class=\"built_in\">enable<\/span> a specified (group of) xmethod(s)<\/span>\r\n<span class=\"line\">ftrace -- Set a fast tracepoint at specified location<\/span>\r\n<span class=\"line\">hbreak -- Set a hardware assisted breakpoint<\/span>\r\n<span class=\"line\">ignore -- Set ignore-count of breakpoint number N to COUNT<\/span>\r\n<span class=\"line\">rbreak -- Set a breakpoint <span class=\"keyword\">for<\/span> all <span class=\"built_in\">functions<\/span> matching REGEXP<\/span>\r\n<span class=\"line\">rwatch -- Set a <span class=\"built_in\">read<\/span> watchpoint <span class=\"keyword\">for<\/span> an expression<\/span>\r\n<span class=\"line\">save -- Save breakpoint definitions as a script<\/span>\r\n<span class=\"line\">save breakpoints -- Save current breakpoint definitions as a script<\/span>\r\n<span class=\"line\">save gdb-index -- Save a gdb-index file<\/span>\r\n<span class=\"line\">save tracepoints -- Save current tracepoint definitions as a script<\/span>\r\n<span class=\"line\">skip -- Ignore a <span class=\"keyword\">function<\/span> <span class=\"keyword\">while<\/span> stepping<\/span>\r\n<span class=\"line\">skip delete -- Delete skip entries<\/span>\r\n<span class=\"line\">skip <span class=\"built_in\">disable<\/span> -- Disable skip entries<\/span>\r\n<span class=\"line\">skip <span class=\"built_in\">enable<\/span> -- Enable skip entries<\/span>\r\n<span class=\"line\">skip file -- Ignore a file <span class=\"keyword\">while<\/span> stepping<\/span>\r\n<span class=\"line\">skip <span class=\"keyword\">function<\/span> -- Ignore a <span class=\"keyword\">function<\/span> <span class=\"keyword\">while<\/span> stepping<\/span>\r\n<span class=\"line\">strace -- Set a static tracepoint at location or marker<\/span>\r\n<span class=\"line\">tbreak -- Set a temporary breakpoint<\/span>\r\n<span class=\"line\">tcatch -- Set temporary catchpoints to catch events<\/span>\r\n<span class=\"line\">tcatch assert -- Catch failed Ada assertions<\/span>\r\n<span class=\"line\">tcatch catch -- Catch an exception<\/span>\r\n<span class=\"line\">tcatch exception -- Catch Ada exceptions<\/span>\r\n<span class=\"line\">tcatch <span class=\"built_in\">exec<\/span> -- Catch calls to <span class=\"built_in\">exec<\/span><\/span>\r\n<span class=\"line\">tcatch fork -- Catch calls to fork<\/span>\r\n<span class=\"line\">tcatch load -- Catch loads of shared libraries<\/span>\r\n<span class=\"line\">tcatch rethrow -- Catch an exception<\/span>\r\n<span class=\"line\">tcatch signal -- Catch signals by their names and\/or numbers<\/span>\r\n<span class=\"line\">tcatch syscall -- Catch system calls by their names and\/or numbers<\/span>\r\n<span class=\"line\">tcatch throw -- Catch an exception<\/span>\r\n<span class=\"line\">tcatch unload -- Catch unloads of shared libraries<\/span>\r\n<span class=\"line\">tcatch vfork -- Catch calls to vfork<\/span>\r\n<span class=\"line\">thbreak -- Set a temporary hardware assisted breakpoint<\/span>\r\n<span class=\"line\">trace -- Set a tracepoint at specified location<\/span>\r\n<span class=\"line\">watch -- Set a watchpoint <span class=\"keyword\">for<\/span> an expression<\/span>\r\n\r\n<span class=\"line\">Type <span class=\"string\">\"help\"<\/span> followed by <span class=\"built_in\">command<\/span> name <span class=\"keyword\">for<\/span> full documentation.<\/span>\r\n<span class=\"line\">Type <span class=\"string\">\"apropos word\"<\/span> to search <span class=\"keyword\">for<\/span> commands related to <span class=\"string\">\"word\"<\/span>.<\/span>\r\n<span class=\"line\">Command name abbreviations are allowed <span class=\"keyword\">if<\/span> unambiguous.<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>\u663e\u800c\u6613\u89c1\uff0cGDB \u8fd8\u6709\u5f88\u591a\u529f\u80fd\uff0c\u800c\u6211\u4ec5\u53ea\u662f\u5728\u89e3\u51b3\u95ee\u9898\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u4e86\u5176\u4e2d\u5f88\u5c0f\u4e00\u90e8\u5206\u3002<\/p>\n<h2 id=\"\u5eff\u4e94_\u00b7_\u7ed3\u8bed\">\u5eff\u4e94 \u00b7 \u7ed3\u8bed<\/h2>\n<p>\u597d\u5427\uff0c\u8fd9\u91cc\u6211\u9047\u5230\u7684\u95ee\u9898\u6bd4\u8f83\u6076\u5fc3\uff1a\u8fd9\u662f\u4e00\u4e2a\u7531 LLVM \u7684 bug \u7ecf\u7531 ncurses \u6700\u7ec8\u5bfc\u81f4 Python \u7a0b\u5e8f\u5d29\u6e83\u7684\u4f8b\u5b50\u3002\u4e0d\u8fc7\uff0c\u89e3\u51b3\u95ee\u9898\u8fc7\u7a0b\u4e2d\uff0c\u6211\u7528\u5230\u7684\u547d\u4ee4\u548c\u4f7f\u7528\u4ed6\u4eec\u7684\u6d41\u7a0b\u57fa\u672c\u5c31\u662f\u8c03\u8bd5\u67e5\u9519\u7684\u57fa\u672c\u6d41\u7a0b\uff1a\u67e5\u770b\u8c03\u7528\u6808\u3001\u68c0\u67e5\u5bc4\u5b58\u5668\u3001\u8bbe\u7f6e\u65ad\u70b9\u3001\u5355\u6b65\u8c03\u8bd5\u3001\u6d4f\u89c8\u4ee3\u7801\u3002<\/p>\n<p>\u5f53\u6211\u5728\u51e0\u5e74\u524d\u7b2c\u4e00\u6b21\u4f7f\u7528 GDB \u65f6\uff0c\u6211\u771f\u7684\u4e0d\u600e\u4e48\u559c\u6b22\u5b83\u3002\u5b83\u770b\u8d77\u6765\u53c8\u7b28\u62d9\u53c8\u96be\u7528\u3002\u7136\u800c\uff0cGDB \u5df2\u7ecf\u6539\u8fdb\u4e86\u5f88\u591a\uff0c\u540c\u65f6\u4e5f\u6709\u4e86\u4e00\u4e9b GDB \u8c03\u8bd5\u67e5\u9519\u7684\u6280\u5de7\u4e4b\u540e\uff0c\u73b0\u5728\u6211\u8ba4\u4e3a\u5b83\u662f\u4e00\u4e2a\u5f3a\u5927\u7684\u73b0\u4ee3\u8c03\u8bd5\u5668\u3002\u4e0d\u540c\u8c03\u8bd5\u5668\u6709\u4e0d\u540c\u7684\u6280\u80fd\uff0c\u4f46\u662f GDB \u5fc5\u662f\u5176\u4e2d\u6700\u5f3a\u5927\u7684\u6587\u672c\u8c03\u8bd5\u5668\u2014\u2014\u5f53\u7136\u00a0<code>lldb<\/code>\u00a0\u6b63\u5728\u8fce\u5934\u8d76\u4e0a\u3002<\/p>\n<p>\u5728\u6b64\uff0c\u6211\u5e0c\u671b\u6240\u6709\u67e5\u627e GDB \u8c03\u8bd5\u8303\u4f8b\u7684\u4eba\u4f1a\u4ece\u6211\u7684\u4f8b\u5b50\u548c\u8b66\u793a\u4e2d\u5b66\u5230\u4e1c\u897f\u3002\u5f53\u7136\uff0c\u4ee5\u540e\u6709\u673a\u4f1a\u6211\u4e5f\u4f1a\u5206\u4eab\u66f4\u591a\u5173\u4e8e GDB \u7684\u7ecf\u9a8c\u2014\u2014\u5c24\u5176\u662f\u8bf8\u5982 JAVA \u7684\u8fd0\u884c\u65f6\u95ee\u9898\u3002<\/p>\n<p>\u54e6\u5bf9\u4e86\uff0c\u9000\u51fa GDB \u7684\u65b9\u6cd5\u662f\u00a0<code>q<\/code>\u00a0(<code>quit<\/code>) \u547d\u4ee4\u3002\uff08\u8bd1\u8005\u6ce8\uff1a\u4f60\u4e5f\u53ef\u4ee5\u4f7f\u7528\u00a0<code>Ctrl + D<\/code>\u00a0\u6765\u9000\u51fa GDB \u8c03\u8bd5\u5668\u3002\uff09<\/p>\n<div>\n<div id=\"i-share\" class=\"btn btn-default need-share-button\" data-share-position=\"topCenter\" data-share-icon-style=\"default\" data-share-networks=\"Wechat,Weibo,Renren,Twitter,Facebook,GooglePlus,Douban,QQZone,Evernote\"><\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u53d1\u8868\u4e8e\u00a02017 \u5e74 05 \u6708 27 \u65e5<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"colormag_page_container_layout":"default_layout","colormag_page_sidebar_layout":"default_layout","footnotes":""},"categories":[],"tags":[117],"class_list":["post-793","post","type-post","status-publish","format-standard","hentry","tag-01-linux"],"_links":{"self":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts\/793","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/comments?post=793"}],"version-history":[{"count":0,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts\/793\/revisions"}],"wp:attachment":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/media?parent=793"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/categories?post=793"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/tags?post=793"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}