diff --git a/404.html b/404.html new file mode 100644 index 0000000..95cdacb --- /dev/null +++ b/404.html @@ -0,0 +1,21 @@ + + + + + + 斯人如彩虹 + + + + + + + + + + + +
+ + + diff --git a/PrideandPrejudice.png b/PrideandPrejudice.png new file mode 100644 index 0000000..cda45d3 Binary files /dev/null and b/PrideandPrejudice.png differ diff --git a/assets/css/0.styles.ece217d8.css b/assets/css/0.styles.ece217d8.css new file mode 100644 index 0000000..534d0a3 --- /dev/null +++ b/assets/css/0.styles.ece217d8.css @@ -0,0 +1,10 @@ +.medium-zoom-overlay{z-index:100}.medium-zoom-overlay~img{z-index:101}html{scroll-behavior:smooth}.back-to-ceiling[data-v-c6073ba8]{background-color:#fff;background-color:var(--background-color);box-shadow:0 1px 6px 0 rgba(0,0,0,.2);box-shadow:var(--box-shadow);position:fixed;display:inline-block;text-align:center;cursor:pointer}.back-to-ceiling[data-v-c6073ba8]::hover{background:#d5dbe7}.back-to-ceiling .icon[data-v-c6073ba8]{position:absolute;top:0;bottom:0;left:0;right:0;margin:auto;width:26px;height:26px;fill:#3eaf7c}.fade-enter-active[data-v-c6073ba8],.fade-leave-active[data-v-c6073ba8]{transition:all .5s}.fade-enter[data-v-c6073ba8],.fade-leave-to[data-v-c6073ba8]{opacity:0;transform:translateY(120px)}#loader-wrapper[data-v-d48f4d20]{height:100vh;width:100vw;background:#fff;background:var(--background-color)}#loader-wrapper .loader-main[data-v-d48f4d20]{position:fixed;width:120px;height:50px;top:45%;left:50%;z-index:555;transform:translate(-50%)}#loader-wrapper .loader-main div[data-v-d48f4d20]:nth-child(2){-webkit-animation:pacman-balls-data-v-d48f4d20 1s linear 0s infinite;animation:pacman-balls-data-v-d48f4d20 1s linear 0s infinite}#loader-wrapper .loader-main div[data-v-d48f4d20]:nth-child(3){-webkit-animation:pacman-balls-data-v-d48f4d20 1s linear .33s infinite;animation:pacman-balls-data-v-d48f4d20 1s linear .33s infinite}#loader-wrapper .loader-main div[data-v-d48f4d20]:nth-child(4){-webkit-animation:pacman-balls-data-v-d48f4d20 1s linear .66s infinite;animation:pacman-balls-data-v-d48f4d20 1s linear .66s infinite}#loader-wrapper .loader-main div[data-v-d48f4d20]:nth-child(5){-webkit-animation:pacman-balls-data-v-d48f4d20 1s linear .99s infinite;animation:pacman-balls-data-v-d48f4d20 1s linear .99s infinite}#loader-wrapper .loader-main div[data-v-d48f4d20]:first-of-type{width:0;height:0;border:25px solid #3eaf7c;border-right-color:transparent;border-radius:25px;-webkit-animation:rotate_pacman_half_up-data-v-d48f4d20 .5s 0s infinite;animation:rotate_pacman_half_up-data-v-d48f4d20 .5s 0s infinite}#loader-wrapper .loader-main div[data-v-d48f4d20]:nth-child(2){width:0;height:0;border:25px solid #3eaf7c;border-right-color:transparent;border-radius:25px;-webkit-animation:rotate_pacman_half_down-data-v-d48f4d20 .5s 0s infinite;animation:rotate_pacman_half_down-data-v-d48f4d20 .5s 0s infinite;margin-top:-50px}#loader-wrapper .loader-main div[data-v-d48f4d20]:nth-child(3),#loader-wrapper .loader-main div[data-v-d48f4d20]:nth-child(4),#loader-wrapper .loader-main div[data-v-d48f4d20]:nth-child(5),#loader-wrapper .loader-main div[data-v-d48f4d20]:nth-child(6){background-color:#3eaf7c;width:15px;height:15px;border-radius:100%;margin:2px;width:10px;height:10px;position:absolute;transform:translateY(-6.25px);top:25px;left:100px}#loader-wrapper .title[data-v-d48f4d20]{margin:8rem auto 2rem;font-size:30px}#loader-wrapper .description[data-v-d48f4d20],#loader-wrapper .title[data-v-d48f4d20]{text-align:center;color:#242424;color:var(--text-color);box-sizing:border-box;padding:0 10px;text-shadow:0 2px 10px rgba(0,0,0,.2)}#loader-wrapper .description[data-v-d48f4d20]{margin:auto;font-size:22px}@-webkit-keyframes pacman-balls-data-v-d48f4d20{75%{opacity:.7}to{transform:translate(-100px,-6.25px)}}@keyframes pacman-balls-data-v-d48f4d20{75%{opacity:.7}to{transform:translate(-100px,-6.25px)}}@-webkit-keyframes rotate_pacman_half_up-data-v-d48f4d20{0%{transform:rotate(270deg)}50%{transform:rotate(1turn)}to{transform:rotate(270deg)}}@keyframes rotate_pacman_half_up-data-v-d48f4d20{0%{transform:rotate(270deg)}50%{transform:rotate(1turn)}to{transform:rotate(270deg)}}@-webkit-keyframes rotate_pacman_half_down-data-v-d48f4d20{0%{transform:rotate(90deg)}50%{transform:rotate(0deg)}to{transform:rotate(90deg)}}@keyframes rotate_pacman_half_down-data-v-d48f4d20{0%{transform:rotate(90deg)}50%{transform:rotate(0deg)}to{transform:rotate(90deg)}}.pagation[data-v-094d08e4]{font-weight:700;text-align:center;color:#888;color:var(--text-color);margin:20px auto 0;background:#f2f2f2;background:var(--background-color)}.pagation .pagation-list[data-v-094d08e4]{font-size:0;line-height:50px;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.pagation .pagation-list span[data-v-094d08e4]{font-size:14px}.pagation .pagation-list span.jump[data-v-094d08e4],.pagation .pagation-list span.jumpinp input[data-v-094d08e4]{box-shadow:var(--box-shadow);border:1px solid var(--border-color)!important;border:1px solid #ccc}.pagation .pagation-list span.jump[data-v-094d08e4]{padding:5px 8px;border-radius:4px;cursor:pointer;margin-left:5px}.pagation .pagation-list span.jumpinp input[data-v-094d08e4]{width:55px;height:26px;background-color:var(--background-color);font-size:13px;border-radius:4px;text-align:center;outline:none}.pagation .pagation-list span.bgprimary[data-v-094d08e4]{cursor:default;color:#fff;background:#3eaf7c;border-color:#3eaf7c}.pagation .pagation-list span.ellipsis[data-v-094d08e4]{padding:0 8px}.pagation .pagation-list span.jumppoint[data-v-094d08e4]{margin:0 10px 0 30px}.valine-wrapper #valine.v .vbtn{color:#2c3e50;color:var(--text-color);border:1px solid #eaecef;border-color:var(--border-color)}.valine-wrapper #valine.v .vbtn:hover{color:#3eaf7c;border-color:#3eaf7c}.valine-wrapper #valine.v .vwrap{background:rgba(27,31,35,.05);background:var(--code-color);border:1px solid #eaecef;border-color:var(--border-color)}.valine-wrapper #valine.v .vwrap .vheader .vinput{border-bottom:1px dashed var(--border-color)}.valine-wrapper #valine.v .vwrap .vheader .vinput:focus{border-bottom-color:#3eaf7c}.valine-wrapper #valine.v .vwrap .vheader .vinput:-internal-autofill-selected{background-color:var(--code-color)!important}.valine-wrapper #valine.v .vinfo{padding-left:.6rem}.valine-wrapper #valine.v .vcard .vquote{margin-left:0;border-left:none}.valine-wrapper #valine.v .vcard .vimg{width:2.8rem;height:2.8rem;border-radius:.25rem;border:none}.valine-wrapper #valine.v .vcard .vhead .vnick{color:#3eaf7c}.valine-wrapper #valine.v .vcard .vhead .vnick:before{background:#3eaf7c}.valine-wrapper #valine.v .vh{border-bottom:none}.valine-wrapper #valine.v .vh .vhead .vsys{color:#3eaf7c;color:var(--text-color);background:rgba(27,31,35,.05);background:var(--code-color)}.valine-wrapper #valine.v .vh .vmeta{margin-bottom:1rem}.valine-wrapper #valine.v .vh .vmeta .vat{margin-right:.3rem;background:rgba(27,31,35,.05);background:var(--code-color);border-radius:.25rem;padding:0 .4rem;color:var(--text-color);border:1px solid #eaecef;border-color:var(--border-color)}.valine-wrapper #valine.v .vh .vmeta .vat:hover{color:#3eaf7c;border-color:#3eaf7c}.valine-wrapper #valine.v .vh .vcontent{background:rgba(27,31,35,.05);background:var(--code-color);border-radius:.25rem;margin:0 .3rem;padding:.1rem .6rem .05rem}.valine-wrapper #valine.v .vh .vcontent p .at{color:#3eaf7c}.valine-wrapper #valine.v .vh .vcontent.expand:before{z-index:1;background:linear-gradient(180deg,hsla(0,0%,100%,0),#fff);background:linear-gradient(180deg,hsla(0,0%,100%,0),var(--background-color))}.valine-wrapper #valine.v .vh .vcontent.expand:after{color:#3eaf7c;color:var(--text-color);background:#fff;background:var(--background-color)}.valine-wrapper #valine.v .info{padding-right:.6rem}.valine-wrapper #valine.v .vbtn,.valine-wrapper #valine.v code,.valine-wrapper #valine.v pre{background:var(--background-color);color:var(--text-color)}.valine-wrapper #valine.v a{color:#3eaf7c}.valine-wrapper #valine.v a:before{background:#3eaf7c} + +/*! + * vssue - A vue-powered issue-based comment plugin + * + * @version v1.4.8 + * @link https://vssue.js.org + * @license MIT + * @copyright 2018-2021 meteorlxy + */.vssue{color:#2c3e50}@media screen and (max-width:576px){.vssue .vssue-new-comment .vssue-new-comment-body{margin-left:60px}}@media screen and (min-width:577px){.vssue .vssue-new-comment .vssue-new-comment-body{margin-left:70px}}@media screen and (max-width:576px){.vssue .vssue-new-comment .vssue-new-comment-footer{text-align:center}.vssue .vssue-new-comment .vssue-new-comment-footer .vssue-new-comment-operations{margin-top:10px}}@media screen and (min-width:577px){.vssue .vssue-new-comment .vssue-new-comment-footer{margin-left:70px;text-align:right}.vssue .vssue-new-comment .vssue-new-comment-footer .vssue-current-user{float:left}}@media screen and (max-width:576px){.vssue .vssue-comments .vssue-comment .vssue-comment-body{margin-left:60px}}@media screen and (min-width:577px){.vssue .vssue-comments .vssue-comment .vssue-comment-body{margin-left:70px}}@media screen and (max-width:576px){.vssue .vssue-pagination{flex-direction:column;justify-content:center;text-align:center}}@media screen and (max-width:576px){.vssue .vssue-pagination .vssue-pagination-page{margin-top:10px}}@media screen and (min-width:577px){.vssue .vssue-pagination .vssue-pagination-page{text-align:right}}.markdown-body .tab-size[data-tab-size="1"]{-o-tab-size:1}.markdown-body .tab-size[data-tab-size="2"]{-o-tab-size:2}.markdown-body .tab-size[data-tab-size="3"]{-o-tab-size:3}.markdown-body .tab-size[data-tab-size="4"]{-o-tab-size:4}.markdown-body .tab-size[data-tab-size="5"]{-o-tab-size:5}.markdown-body .tab-size[data-tab-size="6"]{-o-tab-size:6}.markdown-body .tab-size[data-tab-size="7"]{-o-tab-size:7}.markdown-body .tab-size[data-tab-size="8"]{-o-tab-size:8}.markdown-body .tab-size[data-tab-size="9"]{-o-tab-size:9}.markdown-body .tab-size[data-tab-size="10"]{-o-tab-size:10}.markdown-body .tab-size[data-tab-size="11"]{-o-tab-size:11}.markdown-body .tab-size[data-tab-size="12"]{-o-tab-size:12}@font-face{font-family:octicons-link;src:url(data:font/woff;charset=utf-8;base64,d09GRgABAAAAAAZwABAAAAAACFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEU0lHAAAGaAAAAAgAAAAIAAAAAUdTVUIAAAZcAAAACgAAAAoAAQAAT1MvMgAAAyQAAABJAAAAYFYEU3RjbWFwAAADcAAAAEUAAACAAJThvmN2dCAAAATkAAAABAAAAAQAAAAAZnBnbQAAA7gAAACyAAABCUM+8IhnYXNwAAAGTAAAABAAAAAQABoAI2dseWYAAAFsAAABPAAAAZwcEq9taGVhZAAAAsgAAAA0AAAANgh4a91oaGVhAAADCAAAABoAAAAkCA8DRGhtdHgAAAL8AAAADAAAAAwGAACfbG9jYQAAAsAAAAAIAAAACABiATBtYXhwAAACqAAAABgAAAAgAA8ASm5hbWUAAAToAAABQgAAAlXu73sOcG9zdAAABiwAAAAeAAAAME3QpOBwcmVwAAAEbAAAAHYAAAB/aFGpk3jaTY6xa8JAGMW/O62BDi0tJLYQincXEypYIiGJjSgHniQ6umTsUEyLm5BV6NDBP8Tpts6F0v+k/0an2i+itHDw3v2+9+DBKTzsJNnWJNTgHEy4BgG3EMI9DCEDOGEXzDADU5hBKMIgNPZqoD3SilVaXZCER3/I7AtxEJLtzzuZfI+VVkprxTlXShWKb3TBecG11rwoNlmmn1P2WYcJczl32etSpKnziC7lQyWe1smVPy/Lt7Kc+0vWY/gAgIIEqAN9we0pwKXreiMasxvabDQMM4riO+qxM2ogwDGOZTXxwxDiycQIcoYFBLj5K3EIaSctAq2kTYiw+ymhce7vwM9jSqO8JyVd5RH9gyTt2+J/yUmYlIR0s04n6+7Vm1ozezUeLEaUjhaDSuXHwVRgvLJn1tQ7xiuVv/ocTRF42mNgZGBgYGbwZOBiAAFGJBIMAAizAFoAAABiAGIAznjaY2BkYGAA4in8zwXi+W2+MjCzMIDApSwvXzC97Z4Ig8N/BxYGZgcgl52BCSQKAA3jCV8CAABfAAAAAAQAAEB42mNgZGBg4f3vACQZQABIMjKgAmYAKEgBXgAAeNpjYGY6wTiBgZWBg2kmUxoDA4MPhGZMYzBi1AHygVLYQUCaawqDA4PChxhmh/8ODDEsvAwHgMKMIDnGL0x7gJQCAwMAJd4MFwAAAHjaY2BgYGaA4DAGRgYQkAHyGMF8NgYrIM3JIAGVYYDT+AEjAwuDFpBmA9KMDEwMCh9i/v8H8sH0/4dQc1iAmAkALaUKLgAAAHjaTY9LDsIgEIbtgqHUPpDi3gPoBVyRTmTddOmqTXThEXqrob2gQ1FjwpDvfwCBdmdXC5AVKFu3e5MfNFJ29KTQT48Ob9/lqYwOGZxeUelN2U2R6+cArgtCJpauW7UQBqnFkUsjAY/kOU1cP+DAgvxwn1chZDwUbd6CFimGXwzwF6tPbFIcjEl+vvmM/byA48e6tWrKArm4ZJlCbdsrxksL1AwWn/yBSJKpYbq8AXaaTb8AAHja28jAwOC00ZrBeQNDQOWO//sdBBgYGRiYWYAEELEwMTE4uzo5Zzo5b2BxdnFOcALxNjA6b2ByTswC8jYwg0VlNuoCTWAMqNzMzsoK1rEhNqByEyerg5PMJlYuVueETKcd/89uBpnpvIEVomeHLoMsAAe1Id4AAAAAAAB42oWQT07CQBTGv0JBhagk7HQzKxca2sJCE1hDt4QF+9JOS0nbaaYDCQfwCJ7Au3AHj+LO13FMmm6cl7785vven0kBjHCBhfpYuNa5Ph1c0e2Xu3jEvWG7UdPDLZ4N92nOm+EBXuAbHmIMSRMs+4aUEd4Nd3CHD8NdvOLTsA2GL8M9PODbcL+hD7C1xoaHeLJSEao0FEW14ckxC+TU8TxvsY6X0eLPmRhry2WVioLpkrbp84LLQPGI7c6sOiUzpWIWS5GzlSgUzzLBSikOPFTOXqly7rqx0Z1Q5BAIoZBSFihQYQOOBEdkCOgXTOHA07HAGjGWiIjaPZNW13/+lm6S9FT7rLHFJ6fQbkATOG1j2OFMucKJJsxIVfQORl+9Jyda6Sl1dUYhSCm1dyClfoeDve4qMYdLEbfqHf3O/AdDumsjAAB42mNgYoAAZQYjBmyAGYQZmdhL8zLdDEydARfoAqIAAAABAAMABwAKABMAB///AA8AAQAAAAAAAAAAAAAAAAABAAAAAA==) format("woff")}.markdown-body .octicon{display:inline-block;fill:currentColor;vertical-align:text-bottom}.markdown-body .anchor{float:left;line-height:1;margin-left:-20px;padding-right:4px}.markdown-body .anchor:focus{outline:none}.markdown-body h1 .octicon-link,.markdown-body h2 .octicon-link,.markdown-body h3 .octicon-link,.markdown-body h4 .octicon-link,.markdown-body h5 .octicon-link,.markdown-body h6 .octicon-link{color:#1b1f23;vertical-align:middle;visibility:hidden}.markdown-body h1:hover .anchor,.markdown-body h2:hover .anchor,.markdown-body h3:hover .anchor,.markdown-body h4:hover .anchor,.markdown-body h5:hover .anchor,.markdown-body h6:hover .anchor{text-decoration:none}.markdown-body h1:hover .anchor .octicon-link,.markdown-body h2:hover .anchor .octicon-link,.markdown-body h3:hover .anchor .octicon-link,.markdown-body h4:hover .anchor .octicon-link,.markdown-body h5:hover .anchor .octicon-link,.markdown-body h6:hover .anchor .octicon-link{visibility:visible}.markdown-body{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;color:#24292e;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-size:16px;line-height:1.5;word-wrap:break-word}.markdown-body .pl-c{color:#6a737d}.markdown-body .pl-c1,.markdown-body .pl-s .pl-v{color:#005cc5}.markdown-body .pl-e,.markdown-body .pl-en{color:#6f42c1}.markdown-body .pl-s .pl-s1,.markdown-body .pl-smi{color:#24292e}.markdown-body .pl-ent{color:#22863a}.markdown-body .pl-k{color:#d73a49}.markdown-body .pl-pds,.markdown-body .pl-s,.markdown-body .pl-s .pl-pse .pl-s1,.markdown-body .pl-sr,.markdown-body .pl-sr .pl-cce,.markdown-body .pl-sr .pl-sra,.markdown-body .pl-sr .pl-sre{color:#032f62}.markdown-body .pl-smw,.markdown-body .pl-v{color:#e36209}.markdown-body .pl-bu{color:#b31d28}.markdown-body .pl-ii{background-color:#b31d28;color:#fafbfc}.markdown-body .pl-c2{background-color:#d73a49;color:#fafbfc}.markdown-body .pl-c2:before{content:"^M"}.markdown-body .pl-sr .pl-cce{color:#22863a;font-weight:700}.markdown-body .pl-ml{color:#735c0f}.markdown-body .pl-mh,.markdown-body .pl-mh .pl-en,.markdown-body .pl-ms{color:#005cc5;font-weight:700}.markdown-body .pl-mi{color:#24292e;font-style:italic}.markdown-body .pl-mb{color:#24292e;font-weight:700}.markdown-body .pl-md{background-color:#ffeef0;color:#b31d28}.markdown-body .pl-mi1{background-color:#f0fff4;color:#22863a}.markdown-body .pl-mc{background-color:#ffebda;color:#e36209}.markdown-body .pl-mi2{background-color:#005cc5;color:#f6f8fa}.markdown-body .pl-mdr{color:#6f42c1;font-weight:700}.markdown-body .pl-ba{color:#586069}.markdown-body .pl-sg{color:#959da5}.markdown-body .pl-corl{color:#032f62;text-decoration:underline}.markdown-body details{display:block}.markdown-body summary{display:list-item}.markdown-body a{background-color:transparent}.markdown-body a:active,.markdown-body a:hover{outline-width:0}.markdown-body strong{font-weight:inherit;font-weight:bolder}.markdown-body h1{margin:.67em 0}.markdown-body img{border-style:none}.markdown-body code,.markdown-body kbd,.markdown-body pre{font-family:monospace,monospace;font-size:1em}.markdown-body hr{box-sizing:content-box;overflow:visible}.markdown-body input{font:inherit;margin:0;overflow:visible}.markdown-body [type=checkbox]{box-sizing:border-box;padding:0}.markdown-body *{box-sizing:border-box}.markdown-body input{font-family:inherit;font-size:inherit;line-height:inherit}.markdown-body a{color:#0366d6;text-decoration:none}.markdown-body a:hover{text-decoration:underline}.markdown-body strong{font-weight:600}.markdown-body hr{background:transparent;border-bottom:1px solid #dfe2e5;height:0;margin:15px 0;overflow:hidden}.markdown-body hr:after,.markdown-body hr:before{content:"";display:table}.markdown-body hr:after{clear:both}.markdown-body table{border-collapse:collapse;border-spacing:0}.markdown-body td,.markdown-body th{padding:0}.markdown-body details summary{cursor:pointer}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{margin-bottom:0;margin-top:0}.markdown-body h1{font-size:32px}.markdown-body h1,.markdown-body h2{font-weight:600}.markdown-body h2{font-size:24px}.markdown-body h3{font-size:20px}.markdown-body h3,.markdown-body h4{font-weight:600}.markdown-body h4{font-size:16px}.markdown-body h5{font-size:14px}.markdown-body h5,.markdown-body h6{font-weight:600}.markdown-body h6{font-size:12px}.markdown-body p{margin-bottom:10px;margin-top:0}.markdown-body blockquote{margin:0}.markdown-body ol,.markdown-body ul{margin-bottom:0;margin-top:0;padding-left:0}.markdown-body ol ol,.markdown-body ul ol{list-style-type:lower-roman}.markdown-body ol ol ol,.markdown-body ol ul ol,.markdown-body ul ol ol,.markdown-body ul ul ol{list-style-type:lower-alpha}.markdown-body dd{margin-left:0}.markdown-body code,.markdown-body pre{font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace;font-size:12px}.markdown-body pre{margin-bottom:0;margin-top:0}.markdown-body input::-webkit-inner-spin-button,.markdown-body input::-webkit-outer-spin-button{-webkit-appearance:none;appearance:none;margin:0}.markdown-body .border{border:1px solid #e1e4e8!important}.markdown-body .border-0{border:0!important}.markdown-body .border-bottom{border-bottom:1px solid #e1e4e8!important}.markdown-body .rounded-1{border-radius:3px!important}.markdown-body .bg-white{background-color:#fff!important}.markdown-body .bg-gray-light{background-color:#fafbfc!important}.markdown-body .text-gray-light{color:#6a737d!important}.markdown-body .mb-0{margin-bottom:0!important}.markdown-body .my-2{margin-bottom:8px!important;margin-top:8px!important}.markdown-body .py-0{padding-bottom:0!important;padding-top:0!important}.markdown-body .py-2{padding-bottom:8px!important;padding-top:8px!important}.markdown-body .pl-3,.markdown-body .px-3{padding-left:16px!important}.markdown-body .px-3{padding-right:16px!important}.markdown-body .f6{font-size:12px!important}.markdown-body .lh-condensed{line-height:1.25!important}.markdown-body .text-bold{font-weight:600!important}.markdown-body:after,.markdown-body:before{content:"";display:table}.markdown-body:after{clear:both}.markdown-body>:first-child{margin-top:0!important}.markdown-body>:last-child{margin-bottom:0!important}.markdown-body a:not([href]){color:inherit;text-decoration:none}.markdown-body blockquote,.markdown-body dl,.markdown-body ol,.markdown-body p,.markdown-body pre,.markdown-body table,.markdown-body ul{margin-bottom:16px;margin-top:0}.markdown-body hr{background-color:#e1e4e8;border:0;height:.25em;margin:24px 0;padding:0}.markdown-body blockquote{border-left:.25em solid #dfe2e5;color:#6a737d;padding:0 1em}.markdown-body blockquote>:first-child{margin-top:0}.markdown-body blockquote>:last-child{margin-bottom:0}.markdown-body kbd{border:1px solid #c6cbd1;border-bottom-color:#959da5;box-shadow:inset 0 -1px 0 #959da5;font-size:11px}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{font-weight:600;line-height:1.25;margin-bottom:16px;margin-top:24px}.markdown-body h1{font-size:2em}.markdown-body h1,.markdown-body h2{border-bottom:1px solid #eaecef;padding-bottom:.3em}.markdown-body h2{font-size:1.5em}.markdown-body h3{font-size:1.25em}.markdown-body h4{font-size:1em}.markdown-body h5{font-size:.875em}.markdown-body h6{color:#6a737d;font-size:.85em}.markdown-body ol,.markdown-body ul{padding-left:2em}.markdown-body ol ol,.markdown-body ol ul,.markdown-body ul ol,.markdown-body ul ul{margin-bottom:0;margin-top:0}.markdown-body li{word-wrap:break-all}.markdown-body li>p{margin-top:16px}.markdown-body li+li{margin-top:.25em}.markdown-body dl{padding:0}.markdown-body dl dt{font-size:1em;font-style:italic;font-weight:600;margin-top:16px;padding:0}.markdown-body dl dd{margin-bottom:16px;padding:0 16px}.markdown-body table{display:block;overflow:auto;width:100%}.markdown-body table th{font-weight:600}.markdown-body table td,.markdown-body table th{border:1px solid #dfe2e5;padding:6px 13px}.markdown-body table tr{background-color:#fff;border-top:1px solid #c6cbd1}.markdown-body table tr:nth-child(2n){background-color:#f6f8fa}.markdown-body img{background-color:#fff;box-sizing:content-box;max-width:100%}.markdown-body img[align=right]{padding-left:20px}.markdown-body img[align=left]{padding-right:20px}.markdown-body code{background-color:rgba(27,31,35,.05);border-radius:3px;font-size:85%;margin:0;padding:.2em .4em}.markdown-body pre{word-wrap:normal}.markdown-body pre>code{background:transparent;border:0;font-size:100%;margin:0;padding:0;white-space:pre;word-break:normal}.markdown-body .highlight{margin-bottom:16px}.markdown-body .highlight pre{margin-bottom:0;word-break:normal}.markdown-body .highlight pre,.markdown-body pre{background-color:#f6f8fa;border-radius:3px;font-size:85%;line-height:1.45;overflow:auto;padding:16px}.markdown-body pre code{background-color:transparent;border:0;display:inline;line-height:inherit;margin:0;max-width:auto;overflow:visible;padding:0;word-wrap:normal}.markdown-body .commit-tease-sha{color:#444d56;display:inline-block;font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace;font-size:90%}.markdown-body .blob-wrapper{border-bottom-left-radius:3px;border-bottom-right-radius:3px;overflow-x:auto;overflow-y:hidden}.markdown-body .blob-wrapper-embedded{max-height:240px;overflow-y:auto}.markdown-body .blob-num{-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;color:rgba(27,31,35,.3);cursor:pointer;font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace;font-size:12px;line-height:20px;min-width:50px;padding-left:10px;padding-right:10px;text-align:right;user-select:none;vertical-align:top;white-space:nowrap;width:1%}.markdown-body .blob-num:hover{color:rgba(27,31,35,.6)}.markdown-body .blob-num:before{content:attr(data-line-number)}.markdown-body .blob-code{line-height:20px;padding-left:10px;padding-right:10px;position:relative;vertical-align:top}.markdown-body .blob-code-inner{color:#24292e;font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace;font-size:12px;overflow:visible;white-space:pre;word-wrap:normal}.markdown-body .pl-token.active,.markdown-body .pl-token:hover{background:#ffea7f;cursor:pointer}.markdown-body kbd{background-color:#fafbfc;border:1px solid #d1d5da;border-bottom-color:#c6cbd1;border-radius:3px;box-shadow:inset 0 -1px 0 #c6cbd1;color:#444d56;display:inline-block;font:11px SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace;line-height:10px;padding:3px 5px;vertical-align:middle}.markdown-body :checked+.radio-label{border-color:#0366d6;position:relative;z-index:1}.markdown-body .tab-size[data-tab-size="1"]{-moz-tab-size:1;tab-size:1}.markdown-body .tab-size[data-tab-size="2"]{-moz-tab-size:2;tab-size:2}.markdown-body .tab-size[data-tab-size="3"]{-moz-tab-size:3;tab-size:3}.markdown-body .tab-size[data-tab-size="4"]{-moz-tab-size:4;tab-size:4}.markdown-body .tab-size[data-tab-size="5"]{-moz-tab-size:5;tab-size:5}.markdown-body .tab-size[data-tab-size="6"]{-moz-tab-size:6;tab-size:6}.markdown-body .tab-size[data-tab-size="7"]{-moz-tab-size:7;tab-size:7}.markdown-body .tab-size[data-tab-size="8"]{-moz-tab-size:8;tab-size:8}.markdown-body .tab-size[data-tab-size="9"]{-moz-tab-size:9;tab-size:9}.markdown-body .tab-size[data-tab-size="10"]{-moz-tab-size:10;tab-size:10}.markdown-body .tab-size[data-tab-size="11"]{-moz-tab-size:11;tab-size:11}.markdown-body .tab-size[data-tab-size="12"]{-moz-tab-size:12;tab-size:12}.markdown-body .task-list-item{list-style-type:none}.markdown-body .task-list-item+.task-list-item{margin-top:3px}.markdown-body .task-list-item input{margin:0 .2em .25em -1.6em;vertical-align:middle}.markdown-body hr{border-bottom-color:#eee}.markdown-body .pl-0{padding-left:0!important}.markdown-body .pl-1{padding-left:4px!important}.markdown-body .pl-2{padding-left:8px!important}.markdown-body .pl-3{padding-left:16px!important}.markdown-body .pl-4{padding-left:24px!important}.markdown-body .pl-5{padding-left:32px!important}.markdown-body .pl-6{padding-left:40px!important}.markdown-body .pl-7{padding-left:48px!important}.markdown-body .pl-8{padding-left:64px!important}.markdown-body .pl-9{padding-left:80px!important}.markdown-body .pl-10{padding-left:96px!important}.markdown-body .pl-11{padding-left:112px!important}.markdown-body .pl-12{padding-left:128px!important}.clearfix:after,.vssue .vssue-new-comment .vssue-new-comment-footer:after{display:block;clear:both;content:""}.vssue{width:100%;color:#242424;font-size:16px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;padding:10px}.vssue .vssue-button{outline:none;cursor:pointer;padding:10px 20px;font-size:1.05;font-weight:700;color:#3eaf7c;background-color:transparent;border:2px solid #3eaf7c;border-radius:10px}.vssue .vssue-button:disabled{cursor:not-allowed;color:#eaecef;border-color:#eaecef}.vssue .vssue-button:disabled .vssue-icon{fill:#eaecef}.vssue .vssue-button:not(:disabled).vssue-button-default{color:#a3aab1;border-color:#a3aab1}.vssue .vssue-button:not(:disabled).vssue-button-primary{color:#3eaf7c;border-color:#3eaf7c}.vssue .vssue-icon{width:1em;height:1em;vertical-align:-.15em;fill:#3eaf7c;overflow:hidden}.vssue .vssue-icon-loading{-webkit-animation:vssue-keyframe-rotation 1s linear infinite;animation:vssue-keyframe-rotation 1s linear infinite}@-webkit-keyframes vssue-keyframe-rotation{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes vssue-keyframe-rotation{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.vssue .fade-appear-active,.vssue .fade-enter-active{transition:all .3s ease}.vssue .fade-leave-active{transition:all .3s cubic-bezier(1,.5,.8,1)}.vssue .fade-appear,.vssue .fade-enter,.vssue .fade-leave-to{opacity:0}.vssue .vssue-notice{position:relative;z-index:100;transform:translateY(-11px)}.vssue .vssue-notice .vssue-alert{position:absolute;z-index:101;cursor:pointer;top:0;padding:10px 20px;width:100%;color:#3eaf7c;border:2px solid #c3ead8;border-radius:5px;background-color:#f5fbf8}.vssue .vssue-notice .vssue-progress{position:absolute;top:0;left:0;height:2px;background-color:#3eaf7c}.vssue .vssue-status{text-align:center;padding-top:20px;padding-bottom:10px;color:#3eaf7c}.vssue .vssue-status .vssue-icon{font-size:1.4em}.vssue .vssue-status .vssue-status-info{margin-top:10px;margin-bottom:10px}.vssue .vssue-header{padding-bottom:10px;border-bottom:1px solid #eaecef;margin-bottom:10px;overflow:hidden}.vssue .vssue-header .vssue-header-powered-by{float:right}.vssue .vssue-new-comment{border-bottom:1px solid #eaecef;margin-top:10px;margin-bottom:10px}.vssue .vssue-new-comment .vssue-comment-avatar{float:left;width:50px;height:50px}.vssue .vssue-new-comment .vssue-comment-avatar img{width:50px;height:50px}.vssue .vssue-new-comment .vssue-comment-avatar .vssue-icon{cursor:pointer;padding:5px;font-size:50px;fill:#757f8a}.vssue .vssue-new-comment .vssue-new-comment-body{position:relative}@media screen and (max-width:719px){.vssue .vssue-new-comment .vssue-new-comment-body{margin-left:60px}}@media screen and (min-width:720px){.vssue .vssue-new-comment .vssue-new-comment-body{margin-left:70px}}.vssue .vssue-new-comment .vssue-new-comment-body .vssue-new-comment-loading{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.vssue .vssue-new-comment .vssue-new-comment-footer{margin-top:10px;margin-bottom:10px}.vssue .vssue-new-comment .vssue-new-comment-footer .vssue-current-user{color:#a3aab1}.vssue .vssue-new-comment .vssue-new-comment-footer .vssue-current-user .vssue-logout{cursor:pointer;text-decoration:underline;color:#a3aab1;font-weight:400}@media screen and (max-width:719px){.vssue .vssue-new-comment .vssue-new-comment-footer{text-align:center}.vssue .vssue-new-comment .vssue-new-comment-footer .vssue-new-comment-operations{margin-top:10px}}@media screen and (min-width:720px){.vssue .vssue-new-comment .vssue-new-comment-footer{margin-left:70px;text-align:right}.vssue .vssue-new-comment .vssue-new-comment-footer .vssue-current-user{float:left}}.vssue .vssue-new-comment .vssue-new-comment-input{resize:none;outline:none;width:100%;padding:15px;font-size:16px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;background-color:#f5fbf8;border:1px solid #eaecef;border-radius:5px}.vssue .vssue-new-comment .vssue-new-comment-input:disabled{cursor:not-allowed;background-color:#f0f2f4}.vssue .vssue-new-comment .vssue-new-comment-input:focus{background-color:#fff;border-color:#9adbbe;box-shadow:0 0 1px 1px #9adbbe}.vssue .vssue-new-comment .vssue-new-comment-input::-moz-placeholder{color:#a3aab1}.vssue .vssue-new-comment .vssue-new-comment-input:-ms-input-placeholder{color:#a3aab1}.vssue .vssue-new-comment .vssue-new-comment-input::placeholder{color:#a3aab1}.vssue .vssue-comments .vssue-comment{margin:15px 0}.vssue .vssue-comments .vssue-comment.vssue-comment-edit-mode .vssue-comment-main{border-color:#9adbbe;box-shadow:0 0 1px 1px #9adbbe}.vssue .vssue-comments .vssue-comment.vssue-comment-disabled{pointer-events:none}.vssue .vssue-comments .vssue-comment.vssue-comment-disabled .vssue-comment-body{background-color:#f9f9fa}.vssue .vssue-comments .vssue-comment .vssue-comment-avatar{float:left;width:50px;height:50px}.vssue .vssue-comments .vssue-comment .vssue-comment-avatar img{width:50px;height:50px}@media screen and (max-width:719px){.vssue .vssue-comments .vssue-comment .vssue-comment-body{margin-left:60px}}@media screen and (min-width:720px){.vssue .vssue-comments .vssue-comment .vssue-comment-body{margin-left:70px}}.vssue .vssue-comments .vssue-comment .vssue-comment-header{padding:10px 15px;overflow:hidden;border-top-left-radius:5px;border-top-right-radius:5px;border:1px solid #eaecef;border-bottom:none}.vssue .vssue-comments .vssue-comment .vssue-comment-header .vssue-comment-created-at{float:right;cursor:default;color:#a3aab1}.vssue .vssue-comments .vssue-comment .vssue-comment-main{padding:15px;border:1px solid #eaecef}.vssue .vssue-comments .vssue-comment .vssue-comment-main .vssue-edit-comment-input{resize:none;outline:none;border:none;width:100%;background:transparent}.vssue .vssue-comments .vssue-comment .vssue-comment-footer{padding:10px 15px;overflow:hidden;border-bottom-left-radius:5px;border-bottom-right-radius:5px;border:1px solid #eaecef;border-top:none}.vssue .vssue-comments .vssue-comment .vssue-comment-footer .vssue-comment-hint{cursor:default;color:#a3aab1}.vssue .vssue-comments .vssue-comment .vssue-comment-footer .vssue-comment-reactions .vssue-comment-reaction{cursor:pointer;display:inline-block;margin-right:8px;color:#3eaf7c}.vssue .vssue-comments .vssue-comment .vssue-comment-footer .vssue-comment-operations{float:right;color:#3eaf7c}.vssue .vssue-comments .vssue-comment .vssue-comment-footer .vssue-comment-operations .vssue-comment-operation{cursor:pointer;margin-left:8px}.vssue .vssue-comments .vssue-comment .vssue-comment-footer .vssue-comment-operations .vssue-comment-operation.vssue-comment-operation-muted{color:#a3aab1}.vssue .vssue-comments .vssue-comment .vssue-comment-footer .vssue-comment-operations .vssue-comment-operation.vssue-comment-operation-muted .vssue-icon{fill:#a3aab1}.vssue .vssue-pagination{cursor:default;display:flex;padding:5px;color:#a3aab1}@media screen and (max-width:719px){.vssue .vssue-pagination{flex-direction:column;justify-content:center;text-align:center}}.vssue .vssue-pagination .vssue-pagination-loading,.vssue .vssue-pagination .vssue-pagination-page,.vssue .vssue-pagination .vssue-pagination-per-page{flex:1}@media screen and (max-width:719px){.vssue .vssue-pagination .vssue-pagination-page{margin-top:10px}}@media screen and (min-width:720px){.vssue .vssue-pagination .vssue-pagination-page{text-align:right}}.vssue .vssue-pagination .vssue-pagination-select{outline:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;border:1px solid #9adbbe;padding-left:.2rem;padding-right:1rem;background-color:transparent;background-image:url("data:image/svg+xml;charset=utf8,%3Csvg class='icon' viewBox='0 0 1024 1024' xmlns='http://www.w3.org/2000/svg'%3E%3Cdefs%3E%3Cstyle/%3E%3C/defs%3E%3Cpath d='M676.395 432.896a21.333 21.333 0 0 0-30.166 0L511.061 568.021 377.728 434.645a21.333 21.333 0 0 0-30.165 30.166l148.394 148.48a21.419 21.419 0 0 0 30.208 0l150.23-150.187a21.333 21.333 0 0 0 0-30.208'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:100%}.vssue .vssue-pagination .vssue-pagination-select:disabled{cursor:not-allowed}.vssue .vssue-pagination .vssue-pagination-select:focus{background-color:#fff;box-shadow:0 0 .2px .2px #9adbbe}.vssue .vssue-pagination .vssue-pagination-link{display:inline-block;min-width:1em;text-align:center}.vssue .vssue-pagination .vssue-pagination-link.disabled{pointer-events:none}.vssue .vssue-pagination .vssue-pagination-link:not(.disabled){color:#3eaf7c;font-weight:500;cursor:pointer}.vssue,.vssue *{box-sizing:border-box}.vssue :not(.vssue-comment-content) a{cursor:pointer;font-weight:500;color:#3eaf7c;text-decoration:none}.vssue :not(.vssue-comment-content) hr{display:block;height:1px;border:0;border-top:1px solid #eaecef;margin:1.2rem 0;padding:0}.vssue-wrapper.vssue{color:#2c3e50;color:var(--text-color)}.vssue-wrapper.vssue .vssue-new-comment{border-bottom:1px solid #eaecef;border-bottom:1px solid var(--border-color)}.vssue-wrapper.vssue .vssue-new-comment .vssue-new-comment-input:disabled{background-color:#fff;background-color:var(--background-color);border:1px solid #eaecef;border:1px solid var(--border-color)}.vssue-wrapper.vssue .vssue-new-comment .vssue-new-comment-footer .vssue-current-user{color:#2c3e50;color:var(--text-color)}.vssue-wrapper.vssue .vssue-header{border-bottom:1px solid #eaecef;border-bottom:1px solid var(--border-color)}.vssue-wrapper.vssue .vssue-comments .vssue-pagination .vssue-pagination-per-page .vssue-pagination-select{color:var(--text-color)}.vssue-wrapper.vssue .vssue-comments .vssue-comment .vssue-comment-body .vssue-comment-footer,.vssue-wrapper.vssue .vssue-comments .vssue-comment .vssue-comment-body .vssue-comment-header,.vssue-wrapper.vssue .vssue-comments .vssue-comment .vssue-comment-body .vssue-comment-main{border:none}.vssue-wrapper.vssue .vssue-comments .vssue-comment .vssue-comment-body .vssue-comment-footer,.vssue-wrapper.vssue .vssue-comments .vssue-comment .vssue-comment-body .vssue-comment-main{background:var(--code-color)}.vssue-wrapper.vssue .vssue-comments .vssue-comment .vssue-comment-body .vssue-comment-footer{border-top:2px solid var(--background-color)}.vssue-wrapper.vssue .vssue-comments .vssue-comment .vssue-comment-avatar img{width:2.8rem;height:2.8rem;border-radius:.25rem}.vssue-wrapper.vssue .markdown-body{color:var(--text-color)}#nprogress{pointer-events:none}#nprogress .bar{background:#3eaf7c;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #3eaf7c,0 0 5px #3eaf7c;opacity:1;transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border-color:#3eaf7c transparent transparent #3eaf7c;border-style:solid;border-width:2px;border-radius:50%;-webkit-animation:nprogress-spinner .4s linear infinite;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@-webkit-keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.icon.outbound{color:#aaa;display:inline-block;vertical-align:middle;position:relative;top:-1px}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.home{padding:3.6rem 2rem 0;max-width:960px;margin:0 auto}.home .hero{text-align:center}.home .hero h1{display:block;font-size:2.5rem;color:var(--text-color)}.home .hero .action,.home .hero .description,.home .hero h1{margin:1.8rem auto}.home .hero .description{font-size:1.6rem;line-height:1.3;color:var(--text-color)}.home .hero .action-button{display:inline-block;font-size:1.2rem;color:#fff;background-color:#3eaf7c;padding:.2rem 1.2rem;border-radius:.25rem;transition:background-color .1s ease;box-sizing:border-box}.home .hero .action-button:hover{background-color:#4abf8a}.home .features{border-top:1px solid var(--border-color);padding:1.2rem 0;margin-top:2.5rem;display:flex;flex-wrap:wrap;align-items:flex-start;align-content:stretch;justify-content:space-between}.home .feature{flex-grow:1;flex-basis:30%;max-width:30%;transition:all .5s;color:var(--text-color)}.home .feature h2{font-size:1.6rem;font-weight:500;border-bottom:none;padding-bottom:0}.home .feature:hover{transform:scale(1.05)}@media (max-width:719px){.home .features{flex-direction:column}.home .feature{max-width:100%;padding:0 2.5rem}}@media (max-width:419px){.home{padding-left:1.5rem;padding-right:1.5rem}.home .hero img{max-height:210px;margin:2rem auto 1.2rem}.home .hero h1{font-size:2rem}.home .hero .action,.home .hero .description,.home .hero h1{margin:1.2rem auto}.home .hero .description{font-size:1.2rem}.home .hero .action-button{font-size:1rem;padding:.6rem 1.2rem}.home .feature h2{font-size:1.25rem}}.badge[data-v-08862138]{display:inline-block;font-size:14px;height:18px;line-height:18px;border-radius:.25rem;padding:0 6px;color:#fff}.badge.green[data-v-08862138],.badge.tip[data-v-08862138],.badge[data-v-08862138]{background-color:#42b983}.badge.error[data-v-08862138]{background-color:#da5961}.badge.warn[data-v-08862138],.badge.warning[data-v-08862138],.badge.yellow[data-v-08862138]{background-color:#e7c000}.badge+.badge[data-v-08862138]{margin-left:5px}.search-box{display:inline-block;position:relative;margin-right:1rem}.search-box .iconfont{position:absolute;top:0;bottom:0;z-index:0;left:.6rem;margin:auto}.search-box input{cursor:text;width:10rem;height:2rem;color:#5b5b5b;display:inline-block;border:1px solid var(--border-color);border-radius:.25rem;font-size:.9rem;line-height:2rem;padding:0 .5rem 0 2rem;outline:none;transition:all .2s ease;background:transparent;background-size:1rem}.search-box input:focus{cursor:auto;border-color:#3eaf7c}.search-box .suggestions{background:var(--background-color);width:20rem;position:absolute;top:1.5rem;border:1px solid #cfd4db;border-radius:6px;padding:.4rem;list-style-type:none}.search-box .suggestions.align-right{right:0}.search-box .suggestion{line-height:1.4;padding:.4rem .6rem;border-radius:4px;cursor:pointer}.search-box .suggestion a{white-space:normal;color:var(--text-color)}.search-box .suggestion a .page-title{font-weight:600}.search-box .suggestion a .header{font-size:.9em;margin-left:.25em}.search-box .suggestion.focused{background-color:var(--border-color)}.search-box .suggestion.focused a{color:#3eaf7c}@media (max-width:959px){.search-box input{cursor:pointer;width:0;border-color:transparent;position:relative}.search-box input:focus{cursor:text;left:0;width:10rem}}@media (-ms-high-contrast:none){.search-box input{height:2rem}}@media (max-width:959px) and (min-width:719px){.search-box{margin-right:0}.search-box .suggestions{left:0}}@media (max-width:719px){.search-box{margin-right:0}.search-box .suggestions{right:0}}@media (max-width:419px){.search-box .suggestions{width:calc(100vw - 4rem)}.search-box input:focus{width:8rem}}.sidebar-button{cursor:pointer;display:none;width:1.25rem;height:1.25rem;position:absolute;padding:.6rem;top:.6rem;left:1rem}.sidebar-button .icon{display:block;width:1.25rem;height:1.25rem}@media (max-width:719px){.sidebar-button{display:block}}.dropdown-enter,.dropdown-leave-to{height:0!important}.dropdown-wrapper{cursor:pointer}.dropdown-wrapper .dropdown-title{display:block}.dropdown-wrapper .dropdown-title:hover{border-color:transparent}.dropdown-wrapper .dropdown-title .arrow{vertical-align:middle;margin-top:-1px;margin-left:.4rem}.dropdown-wrapper .nav-dropdown .dropdown-item{color:inherit;line-height:1.7rem}.dropdown-wrapper .nav-dropdown .dropdown-item h4{margin:.45rem 0 0;border-top:1px solid var(--border-color);padding:.45rem 1.5rem 0 1.25rem}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem-wrapper{padding:0;list-style:none}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem-wrapper .dropdown-subitem{font-size:.9em}.dropdown-wrapper .nav-dropdown .dropdown-item a{display:block;line-height:1.7rem;position:relative;border-bottom:none;font-weight:400;margin-bottom:0;padding:0 1.5rem 0 1.25rem}.dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active,.dropdown-wrapper .nav-dropdown .dropdown-item a:hover{color:#3eaf7c}.dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active:after{content:"";width:0;height:0;border-left:5px solid #3eaf7c;border-top:3px solid transparent;border-bottom:3px solid transparent;position:absolute;top:calc(50% - 2px);left:9px}.dropdown-wrapper .nav-dropdown .dropdown-item:first-child h4{margin-top:0;padding-top:0;border-top:0}@media (max-width:719px){.dropdown-wrapper.open .dropdown-title{margin-bottom:.5rem}.dropdown-wrapper .nav-dropdown{transition:height .1s ease-out;overflow:hidden}.dropdown-wrapper .nav-dropdown .dropdown-item h4{border-top:0;margin-top:0;padding-top:0}.dropdown-wrapper .nav-dropdown .dropdown-item>a,.dropdown-wrapper .nav-dropdown .dropdown-item h4{font-size:15px;line-height:2rem}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem{font-size:14px;padding-left:1rem}}@media (min-width:719px){.dropdown-wrapper{height:1.8rem}.dropdown-wrapper:hover .nav-dropdown{display:block!important}.dropdown-wrapper .dropdown-title .arrow{border-left:4px solid transparent;border-right:4px solid transparent;border-top:6px solid var(--text-color-sub);border-bottom:0}.dropdown-wrapper .nav-dropdown{display:none;height:auto!important;box-sizing:border-box;max-height:calc(100vh - 2.7rem);overflow-y:auto;position:absolute;top:100%;right:0;background-color:var(--background-color);padding:.6rem 0;box-shadow:var(--box-shadow);text-align:left;border-radius:.25rem;white-space:nowrap;margin:0}}.nav-links{display:inline-block}.nav-links a{line-height:1.4rem;color:var(--text-color)}.nav-links a.router-link-active,.nav-links a.router-link-active .iconfont,.nav-links a:hover,.nav-links a:hover .iconfont{color:#3eaf7c}.nav-links .nav-item{position:relative;display:inline-block;margin-left:1.5rem;line-height:2rem}.nav-links .nav-item:first-child{margin-left:0}.nav-links .repo-link{margin-left:1.5rem}@media (max-width:719px){.nav-links .nav-item,.nav-links .repo-link{margin-left:0}}@media (min-width:719px){.nav-item>a:not(.external).router-link-active,.nav-item>a:not(.external):hover{margin-bottom:-2px}}.mode-options{background-color:var(--background-color);min-width:125px;margin:0;padding:1em;box-shadow:var(--box-shadow);border-radius:.25rem}.mode-options .title{margin-top:0;margin-bottom:.6rem;font-weight:700;color:var(--text-color)}.mode-options .color-mode-options{display:flex;flex-wrap:wrap}.mode-options .color-mode-options li{flex:1;text-align:center;font-size:12px;color:var(--text-color);line-height:18px;padding:3px 6px;border-top:1px solid #666;border-bottom:1px solid #666;background-color:var(--background-color);cursor:pointer}.mode-options .color-mode-options li.dark{border-radius:.25rem 0 0 .25rem;border-left:1px solid #666}.mode-options .color-mode-options li.light{border-radius:0 .25rem .25rem 0;border-right:1px solid #666}.mode-options .color-mode-options li.active{background-color:#3eaf7c;color:#fff}.mode-options .color-mode-options li:not(.active){border-right:1px solid #666}.color-picker{position:relative;margin-right:1em;cursor:pointer}.color-picker .color-button{align-items:center;height:100%}.color-picker .color-button .iconfont{font-size:1.4rem;color:#3eaf7c}.color-picker .color-picker-menu{position:absolute;top:40px;left:50%;z-index:150}.color-picker .color-picker-menu ul{list-style-type:none;margin:0;padding:0}@media (max-width:719px){.color-picker{margin-right:1rem}.color-picker .color-picker-menu{left:calc(50% - 35px)}.color-picker .color-picker-menu:before{left:calc(50% + 35px)}}.navbar{padding:.7rem 1.5rem;line-height:2.2rem;box-shadow:var(--box-shadow);background:var(--background-color)}.navbar a,.navbar img,.navbar span{display:inline-block}.navbar .logo{height:2.2rem;min-width:2.2rem;margin-right:.8rem;vertical-align:top;border-radius:50%}.navbar .site-name{font-size:1.2rem;font-weight:600;color:var(--text-color);position:relative}.navbar .links{padding-left:1.5rem;box-sizing:border-box;white-space:nowrap;font-size:.9rem;position:absolute;right:1.5rem;top:.7rem;display:flex;background-color:var(--background-color)}.navbar .links .search-box{flex:0 0 auto;vertical-align:top}@media (max-width:719px){.navbar{padding-left:4rem}.navbar .can-hide{display:none}.navbar .links{padding-left:.2rem}}.tags[data-v-285c9a44]{margin:30px 0}.tags span[data-v-285c9a44]{vertical-align:middle;margin:4px 4px 10px;padding:4px 8px;display:inline-block;cursor:pointer;border-radius:.25rem;background:#fff;color:#fff;line-height:13px;font-size:13px;box-shadow:var(--box-shadow);transition:all .5s}.tags span[data-v-285c9a44]:hover{transform:scale(1.04)}.tags span.active[data-v-285c9a44]{transform:scale(1.2)}.friend-link-wrapper[data-v-165dc218]{position:relative;margin:30px 0}.friend-link-wrapper .friend-link-item[data-v-165dc218]{position:relative;vertical-align:middle;margin:4px 4px 10px;padding:4px 8px 4px 20px;line-height:20px;display:inline-block;cursor:default;border-radius:.25rem;font-size:13px;box-shadow:var(--box-shadow);transition:all .5s}.friend-link-wrapper .friend-link-item .list-style[data-v-165dc218]{position:absolute;left:.4rem;top:0;bottom:0;margin:auto;display:block;width:.4rem;height:.4rem;border-radius:.1rem;background:#3eaf7c;content:""}.friend-link-wrapper .friend-link-item .popup-window-wrapper[data-v-165dc218]{display:none}.friend-link-wrapper .friend-link-item .popup-window-wrapper .popup-window[data-v-165dc218]{position:absolute;display:flex;background:var(--background-color);box-shadow:var(--box-shadow);border-radius:.25rem;box-sizing:border-box;padding:.8rem 1rem;width:280px}.friend-link-wrapper .friend-link-item .popup-window-wrapper .popup-window .logo[data-v-165dc218]{margin-right:.4rem;width:2rem;height:2rem;flex:0 0 2rem;border-radius:.25rem;overflow:hidden}.friend-link-wrapper .friend-link-item .popup-window-wrapper .popup-window .logo img[data-v-165dc218]{width:2rem;height:2rem}.friend-link-wrapper .friend-link-item .popup-window-wrapper .popup-window .info[data-v-165dc218]{flex:0 0 85%;width:85%}.friend-link-wrapper .friend-link-item .popup-window-wrapper .popup-window .info .title[data-v-165dc218]{display:flex;align-items:center;justify-content:space-between;height:2rem}.friend-link-wrapper .friend-link-item .popup-window-wrapper .popup-window .info .title h4[data-v-165dc218]{margin:.2rem 0;flex:0 0 86%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.friend-link-wrapper .friend-link-item .popup-window-wrapper .popup-window .info .title .btn-go[data-v-165dc218]{width:1.4rem;height:1.2rem;border-radius:.25rem;font-size:12px;color:#fff;text-align:center;line-height:1.2rem;cursor:pointer;transition:all .5s}.friend-link-wrapper .friend-link-item .popup-window-wrapper .popup-window .info .title .btn-go[data-v-165dc218]:hover{transform:scale(1.1)}.fade-enter-active[data-v-165dc218],.fade-leave-active[data-v-165dc218]{transition:opacity .5s}.fade-enter[data-v-165dc218],.fade-leave-to[data-v-165dc218]{opacity:0}.iconfont[data-v-f875f3fc]{display:inline-block;line-height:1.5rem}.iconfont[data-v-f875f3fc]:not(:last-child){margin-right:1rem}.iconfont span[data-v-f875f3fc]{margin-left:.5rem}.tags .tag-item[data-v-f875f3fc]{font-family:Ubuntu,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;cursor:pointer}.tags .tag-item.active[data-v-f875f3fc],.tags .tag-item[data-v-f875f3fc]:hover{color:#3eaf7c}@media (max-width:719px){.tags[data-v-f875f3fc]{display:block;margin-left:0!important}}.abstract-item[data-v-ff2c8be0]{position:relative;margin:0 auto 20px;padding:16px 20px;width:100%;overflow:hidden;border-radius:.25rem;box-shadow:var(--box-shadow);box-sizing:border-box;transition:all .3s;background-color:var(--background-color);cursor:pointer}.abstract-item>[data-v-ff2c8be0]{pointer-events:auto}.abstract-item .reco-sticky[data-v-ff2c8be0]{position:absolute;top:0;left:0;display:inline-block;color:#3eaf7c;font-size:2.4rem}.abstract-item[data-v-ff2c8be0]:hover{box-shadow:var(--box-shadow-hover)}.abstract-item .title[data-v-ff2c8be0]{position:relative;font-size:1.28rem;line-height:46px;display:inline-block}.abstract-item .title a[data-v-ff2c8be0]{color:var(--text-color)}.abstract-item .title .reco-lock[data-v-ff2c8be0]{font-size:1.28rem;color:#3eaf7c}.abstract-item .title[data-v-ff2c8be0]:after{content:"";position:absolute;width:100%;height:2px;bottom:0;left:0;background-color:#3eaf7c;visibility:hidden;transform:scaleX(0);transition:.3s ease-in-out}.abstract-item .title:hover a[data-v-ff2c8be0]{color:#3eaf7c}.abstract-item .title[data-v-ff2c8be0]:hover:after{visibility:visible;transform:scaleX(1)}.abstract-item .tags .tag-item.active[data-v-ff2c8be0],.abstract-item .tags .tag-item[data-v-ff2c8be0]:hover{color:#3eaf7c}@media (max-width:719px){.tags[data-v-ff2c8be0]{display:block;margin-top:1rem;margin-left:0!important}}.sidebar-group{background:var(--background-color)}.sidebar-group .sidebar-group{padding-left:.5em}.sidebar-group:not(.collapsable) .sidebar-heading:not(.clickable){cursor:auto;color:var(--text-color)}.sidebar-group.is-sub-group{padding-left:0}.sidebar-group.is-sub-group>.sidebar-heading{font-size:.95em;line-height:1.4;font-weight:400;padding-left:2rem}.sidebar-group.is-sub-group>.sidebar-heading:not(.clickable){opacity:.5}.sidebar-group.is-sub-group>.sidebar-group-items{padding-left:1rem}.sidebar-group.is-sub-group>.sidebar-group-items>li>.sidebar-link{font-size:.95em;border-left:none}.sidebar-group.depth-2>.sidebar-heading{border-left:none}.sidebar-heading{position:relative;color:var(--text-color);transition:color .15s ease;cursor:pointer;font-size:1em;font-weight:500;padding:.35rem 1.5rem .35rem 1.25rem;width:100%;box-sizing:border-box;margin:0}.sidebar-heading.open,.sidebar-heading:hover{color:#3eaf7c}.sidebar-heading .arrow{position:absolute;top:0;bottom:0;right:1em;margin:auto}.sidebar-heading.clickable.active{font-weight:600;color:#3eaf7c;border-left-color:#3eaf7c}.sidebar-heading.clickable:hover{color:#3eaf7c}.sidebar-group-items{transition:height .1s ease-out;font-size:.95em;overflow:hidden}.abstract-wrapper[data-v-6cc0658a]{width:100%}.personal-info-wrapper .personal-img[data-v-39576ba9]{display:block;margin:2rem auto 1rem;width:6rem;height:6rem;border-radius:50%}.personal-info-wrapper .name[data-v-39576ba9]{font-size:1rem;text-align:center;color:var(--text-color)}.personal-info-wrapper .num[data-v-39576ba9]{display:flex;margin:0 auto 1rem;width:80%}.personal-info-wrapper .num>div[data-v-39576ba9]{text-align:center;flex:0 0 50%}.personal-info-wrapper .num>div[data-v-39576ba9]:first-child{border-right:1px solid #333}.personal-info-wrapper .num>div h3[data-v-39576ba9]{line-height:auto;margin:0 0 .6rem;color:var(--text-color)}.personal-info-wrapper .num>div h6[data-v-39576ba9]{line-height:auto;color:var(--text-color);margin:0}.personal-info-wrapper .social-links[data-v-39576ba9]{box-sizing:border-box;display:flex;flex-wrap:wrap;padding:10px}.personal-info-wrapper .social-links .social-item[data-v-39576ba9]{width:39px;height:36px;line-height:36px;text-align:center;list-style:none;transition:transform .3s}.personal-info-wrapper .social-links .social-item[data-v-39576ba9]:hover{transform:scale(1.08)}.personal-info-wrapper .social-links .social-item i[data-v-39576ba9]{cursor:pointer;font-size:22px}.home-blog{padding:0;margin:0 auto}.home-blog .hero{margin:3.6rem auto 0;position:relative;box-sizing:border-box;padding:0 20px;height:100vh;display:flex;align-items:center;justify-content:center}.home-blog .hero .hero-img{max-width:300px;margin:0 auto 1.5rem}.home-blog .hero h1{display:block;margin:0 auto 1.8rem;font-size:2.5rem}.home-blog .hero .description{margin:1.8rem auto;font-size:1.6rem;line-height:1.3}.home-blog .home-blog-wrapper{display:flex;align-items:flex-start;margin:20px auto 0;padding:0 20px;max-width:1126px}.home-blog .home-blog-wrapper .blog-list{flex:auto;width:0}.home-blog .home-blog-wrapper .blog-list .abstract-wrapper .abstract-item:last-child{margin-bottom:0}.home-blog .home-blog-wrapper .info-wrapper{position:-webkit-sticky;position:sticky;top:70px;overflow:hidden;transition:all .3s;margin-left:15px;flex:0 0 300px;height:auto;box-shadow:var(--box-shadow);border-radius:.25rem;box-sizing:border-box;padding:0 15px;background:var(--background-color)}.home-blog .home-blog-wrapper .info-wrapper:hover{box-shadow:var(--box-shadow-hover)}.home-blog .home-blog-wrapper .info-wrapper h4{color:var(--text-color)}.home-blog .home-blog-wrapper .info-wrapper .category-wrapper{list-style:none;padding-left:0}.home-blog .home-blog-wrapper .info-wrapper .category-wrapper .category-item{margin-bottom:.4rem;padding:.4rem .8rem;transition:all .5s;border-radius:.25rem;box-shadow:var(--box-shadow);background-color:var(--background-color)}.home-blog .home-blog-wrapper .info-wrapper .category-wrapper .category-item:hover{transform:scale(1.04)}.home-blog .home-blog-wrapper .info-wrapper .category-wrapper .category-item:hover a{color:#3eaf7c}.home-blog .home-blog-wrapper .info-wrapper .category-wrapper .category-item a{display:flex;justify-content:space-between;align-items:center;color:var(--text-color)}.home-blog .home-blog-wrapper .info-wrapper .category-wrapper .category-item a .post-num{width:1.6rem;height:1.6rem;text-align:center;line-height:1.6rem;border-radius:.25rem;background:#eee;font-size:13px;color:#fff}@media (max-width:719px){.home-blog .hero{height:450px}.home-blog .hero img{max-height:210px;margin:2rem auto 1.2rem}.home-blog .hero h1{margin:0 auto 1.8rem;font-size:2rem}.home-blog .hero .description{font-size:1.2rem}.home-blog .hero .action-button{font-size:1rem;padding:.6rem 1.2rem}.home-blog .home-blog-wrapper{display:block!important}.home-blog .home-blog-wrapper .blog-list{width:auto}.home-blog .home-blog-wrapper .info-wrapper{margin-left:0}.home-blog .home-blog-wrapper .info-wrapper .personal-info-wrapper{display:none}}@media (max-width:419px){.home-blog .hero{height:450px}.home-blog .hero img{max-height:210px;margin:2rem auto 1.2rem}.home-blog .hero h1{margin:0 auto 1.8rem;font-size:2rem}.home-blog .hero .description{font-size:1.2rem}.home-blog .hero .action-button{font-size:1rem;padding:.6rem 1.2rem}.home-blog .home-blog-wrapper{display:block!important}.home-blog .home-blog-wrapper .blog-list{width:auto}.home-blog .home-blog-wrapper .info-wrapper{margin-left:0}.home-blog .home-blog-wrapper .info-wrapper .personal-info-wrapper{display:none}}.sub-sidebar-wrapper[data-v-cb1513f6]{width:12rem;padding-left:0;list-style:none;font-size:12px}.sub-sidebar-wrapper li[data-v-cb1513f6]{padding:.2rem 0;cursor:pointer;border-left:1px solid var(--border-color)}.sub-sidebar-wrapper li a[data-v-cb1513f6]{padding:.35rem 1rem .35rem 0;color:var(--text-color)}.sub-sidebar-wrapper li:hover a[data-v-cb1513f6]{color:#3eaf7c}.sub-sidebar-wrapper li.active[data-v-cb1513f6]{border-left:1px solid #3eaf7c}.sub-sidebar-wrapper li.active a[data-v-cb1513f6]{color:#3eaf7c}.sub-sidebar-wrapper li.level-1[data-v-cb1513f6]{padding-left:.4rem}.sub-sidebar-wrapper li.level-2[data-v-cb1513f6]{padding-left:.9rem}.sub-sidebar-wrapper li.level-3[data-v-cb1513f6]{padding-left:1.5rem}.page-nav,.page .comments-wrapper,.page .page-edit{max-width:860px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.page-nav,.page .comments-wrapper,.page .page-edit{padding:2rem}}@media (max-width:419px){.page-nav,.page .comments-wrapper,.page .page-edit{padding:1.5rem}}.page{position:relative;padding-top:5rem;padding-bottom:2rem;padding-right:14rem;display:block}.page .side-bar{position:fixed;top:10rem;bottom:10rem;right:2rem;overflow-y:scroll}.page .side-bar::-webkit-scrollbar{width:0;height:0}.page .page-title{max-width:860px;margin:0 auto;padding:1rem 2.5rem;color:var(--text-color)}.page .theme-reco-content h2{position:relative;padding-left:.8rem}.page .theme-reco-content h2:before{position:absolute;left:0;top:3.5rem;display:block;height:1.8rem;content:"";border-left:5px solid #3eaf7c}.page .page-edit{padding-top:1rem;padding-bottom:1rem;overflow:auto}.page .page-edit .edit-link{display:inline-block}.page .page-edit .edit-link a{color:#3eaf7c;margin-right:.25rem}.page .page-edit .last-updated{float:right;font-size:.9em}.page .page-edit .last-updated .prefix{font-weight:500;color:#3eaf7c}.page .page-edit .last-updated .time{font-weight:400;color:#aaa}.page-nav{padding-top:1rem;padding-bottom:0}.page-nav .inner{min-height:2rem;margin-top:0;border-top:1px solid var(--border-color);padding-top:1rem;overflow:auto}.page-nav .next{float:right}@media (max-width:719px){.page{padding-right:0}.page .side-bar{display:none}.page .page-title{padding:0 1rem}.page .page-edit .edit-link{margin-bottom:.5rem}.page .page-edit .last-updated{font-size:.8em;float:none;text-align:left}}.footer-wrapper[data-v-c3cf170c]{padding:1.5rem 2.5rem;border-top:1px solid var(--border-color);text-align:center;color:#5b5b5b}.footer-wrapper a[data-v-c3cf170c]{font-size:14px}.footer-wrapper>span[data-v-c3cf170c]{margin-left:1rem}.footer-wrapper>span>i[data-v-c3cf170c]{margin-right:.5rem}.footer-wrapper .cyber-security img[data-v-c3cf170c]{margin-right:.5rem;width:20px;height:20px;vertical-align:middle}.footer-wrapper .cyber-security a[data-v-c3cf170c]{vertical-align:middle}@media (max-width:719px){.footer[data-v-c3cf170c]{text-align:left!important}.footer>span[data-v-c3cf170c]{display:block;margin-left:0;line-height:2rem}}.sidebar .sidebar-sub-headers{padding-left:1.5rem;font-size:.95em}.sidebar-sub-headers a.sidebar-link{margin:0 1rem 0 .6rem}a.sidebar-link{font-size:1em;font-weight:400;display:block!important;color:var(--text-color);padding:.35rem 1rem .35rem 2.25rem;line-height:1.7;background:var(--background-color);box-sizing:border-box}a.sidebar-link:hover{color:#3eaf7c}a.sidebar-link.active{font-weight:600;color:#3eaf7c;background:var(--default-color-8);border-right:3px solid #3eaf7c}.sidebar-sub-headers a.sidebar-link{padding-top:.25rem;padding-bottom:.25rem;border-left:none}.sidebar-sub-headers a.sidebar-link.active{font-weight:500;background:transparent;color:#3eaf7c}.sidebar.sidebar::-webkit-scrollbar{width:0;height:0}.sidebar .personal-info-wrapper{display:none}.sidebar ul{padding:0;margin:0;list-style-type:none}.sidebar ul.sidebar-links>li{background:#3eaf7c}.sidebar a{display:inline-block}.sidebar .nav-links{display:none;border-bottom:1px solid var(--border-color);padding:.5rem 0 .75rem}.sidebar .nav-links a{font-weight:600}.sidebar .nav-links .nav-item,.sidebar .nav-links .repo-link{display:block;line-height:1.25rem;font-size:1.1em;padding:.5rem 0 .5rem 1.5rem}.sidebar>.sidebar-links{padding:1.5rem 0}.sidebar>.sidebar-links>li>a.sidebar-link{font-size:1em;line-height:1.7;font-weight:500}.sidebar>.sidebar-links>li:not(:first-child){margin-top:.75rem}@media (max-width:719px){.sidebar .nav-links,.sidebar .personal-info-wrapper{display:block}.sidebar .nav-links .dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active:after{top:calc(1rem - 2px)}.sidebar>.sidebar-links{padding:1rem 0}}.password-shadow[data-v-25ba6db2]{overflow:hidden;position:relative;background:#fff;background:var(--background-color);box-sizing:border-box}.password-shadow .title[data-v-25ba6db2]{margin:8rem auto 2rem;width:100%;font-size:30px}.password-shadow .description[data-v-25ba6db2],.password-shadow .title[data-v-25ba6db2]{text-align:center;box-sizing:border-box;text-shadow:0 2px 4px rgba(0,0,0,.1);color:#242424;color:var(--text-color)}.password-shadow .description[data-v-25ba6db2]{margin:0 auto 6rem;font-size:22px;padding:0 10px}.password-shadow .inputBox[data-v-25ba6db2]{position:absolute;top:40%;left:0;right:0;margin:auto;display:block;max-width:700px;height:100px;background:#3eaf7c;border-radius:.25rem;padding-left:20px;box-sizing:border-box;opacity:.9}.password-shadow .inputBox input[data-v-25ba6db2]{width:570px;height:100%;border:none;padding:0 0 0 5px;color:#fff;background:none;outline:none;position:absolute;bottom:0;left:20px;opacity:0;font-size:50px}.password-shadow .inputBox input[data-v-25ba6db2]:focus{opacity:1}.password-shadow .inputBox input:focus~span[data-v-25ba6db2]{transform:translateY(-80px);color:#3eaf7c;font-size:30px;opacity:.8}.password-shadow .inputBox input:focus~button[data-v-25ba6db2]{opacity:1;width:100px}.password-shadow .inputBox span[data-v-25ba6db2]{width:200px;height:100%;display:block;position:absolute;line-height:100px;top:0;left:20px;color:#fff;cursor:text;transition:.5s;transform-origin:left top;font-size:30px}.password-shadow .inputBox button[data-v-25ba6db2]{overflow:hidden;width:0;height:98px;border-radius:.25rem;position:absolute;background:var(--background-color);right:1px;top:1px;border:0;padding:0;color:#3eaf7c;font-size:18px;outline:none;cursor:pointer;opacity:0;transition:.5s;z-index:1}.password-shadow .footer[data-v-25ba6db2]{position:absolute;left:0;right:0;bottom:10%;padding:2.5rem;text-align:center;color:#5b5b5b}.password-shadow .footer>span[data-v-25ba6db2]{margin-left:1rem}.password-shadow .footer>span>i[data-v-25ba6db2]{margin-right:.5rem}@media (max-width:719px){.password-shadow .inputBox[data-v-25ba6db2]{max-width:700px;height:60px;background:#3eaf7c;border-radius:.25rem;position:absolute;left:0;right:0;top:43%;margin:auto 20px;padding-left:0;box-sizing:border-box;opacity:.9}.password-shadow .inputBox input[data-v-25ba6db2]{width:60%;height:100%;border:none;padding:0 0 0 5px;color:#fff;background:none;outline:none;position:absolute;bottom:0;opacity:0;font-size:30px}.password-shadow .inputBox input[data-v-25ba6db2]:focus{opacity:1}.password-shadow .inputBox input:focus~span[data-v-25ba6db2]{transform:translateY(-60px);color:#3eaf7c;font-size:20px;opacity:.8}.password-shadow .inputBox input:focus~button[data-v-25ba6db2]{opacity:1;width:60px}.password-shadow .inputBox span[data-v-25ba6db2]{width:200px;height:100%;display:block;position:absolute;line-height:60px;top:0;left:20px;color:#fff;cursor:text;transition:.5s;transform-origin:left top;font-size:20px}.password-shadow .inputBox button[data-v-25ba6db2]{width:0;height:58px;border-radius:.25rem;position:absolute;right:1px;top:1px;border:0;padding:0;background:#fff;color:#3eaf7c;font-size:18px;outline:none;cursor:pointer;opacity:0;transition:.5s;z-index:1}.password-shadow .footer[data-v-25ba6db2]{margin-left:0}}@media (max-width:959px){.password-shadow .footer[data-v-25ba6db2]{margin-left:0}}.theme-container .loading-wrapper[data-v-1aefc0b4]{position:absolute;z-index:22;top:0;bottom:0;left:0;right:0;margin:auto}.theme-container .password-wrapper-out[data-v-1aefc0b4]{position:absolute;z-index:21;top:0;bottom:0;left:0;right:0;margin:auto}.theme-container .password-wrapper-in[data-v-1aefc0b4]{position:absolute;z-index:8;top:0;bottom:0;left:0;right:0}.theme-container .hide[data-v-1aefc0b4]{height:100vh;overflow:hidden;opacity:0}.fade-enter-active[data-v-1aefc0b4],.fade-leave-active[data-v-1aefc0b4]{transition:opacity .5s ease-in-out .5s}.fade-enter[data-v-1aefc0b4],.fade-leave-to[data-v-1aefc0b4]{opacity:0}@font-face{font-family:iconfont;src:url(data:font/woff2;base64,d09GMgABAAAAACcIAAsAAAAARPAAACa6AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHFQGYACKegrvONktATYCJAOBZAt0AAQgBYRnB4QOG604RaTdtJfiZP8fDugB82cnpUAl0ZGsRjJLjaLz7uhxFXN2ZOvr79/nQ9vQlsfQdlhwYIL57VuYrybm6PdDKXkefu3beTNfbMX8ryOe8ERJpE2URqJUIiWQCFnTRXR4fm7/5967DEZvrBmMGIwesaakR46UsRESreh/UiIiRoPPeJiA2YCJXzGywagXC4A2P3+HXwABBLn77T7wUDKLIGkLrEAC4J+qadm9EOi2d1N1A5JlWJAsW1rM2XwAMOA9HezyISTxp7vy66n8eqYFhgOJzbTIA4FXKq9s6fT0aMUvAyuANKXtRMvW23mZaqU6zi0Tw5Q23vptr7vAApSA5AiRvP//dJat5CPu7sIHCv4At4A9V+WMtDQaL0iLWoXsQ1kHkjdgb8iHWIUAPIvWoeQNSEE7BFzmpSKsrijqABVlnz66ibgowOCca6phdf0xpuk5fkypdQ1CeEMEI4o7artvj4KeMw9UD/WTDIByVVBXARw12EctxActVyWWAoB7rNQgDCg6ZS3apTaYF4Im1Wt4DABv/He+/AK+BQdUmjWwb9KLlzoTGHkJfViztVn9EYyyS4GWKzRRYyhYVfWBPLy8B0hoDtV6uOc6qvQAHlNCawWBR8LEISQmISXjJ5SWgVGuyUrMMDeFLGY5917+07iZev163s//v0vf7P/DZQ0EjYiCzWLr7rzJKWh2p0XT9LZbLx6LkcwgVz7a+mQmZsVKd3uFmv8oD9gwsGTRvOu2TFswal/LulPjZnTc0HXpwpS2ngm3nLlmU9O5STfVRuxadWTNnKFjy1bsGFMpZm07dGJPw4E+pQXgwAOo3hljbxHIATYIDAwIAiwRNLBIMMA8wQLXCQ7YInhgmhCBBUISjBJgn1CBFqEB64QOnBKGjBRmAjBD2ECHcIAbRAh0iRi4JBLggrjLWIWlALSJN9AjMmCCyCWZhf1ARgorQJYPhwKwSTRAk2iBc2IAJokRuElygZpMBkaIBdglxcAqKQGOSBOwRqYDc2QGMCRzgWOyEVgmB4AVcgjYIZeBMfIPUPENkvlhLihmIWwCxTaEXwNwyPd5wAk/3wB7/EoHGvybDRzwf/gQ+uC2u4RXgK8ATD4Cc8/tqvLWqNRcEfSiRslNlbaG2rG3VTqm3H0asCZNBZZoRLEMEXrBmkK8d6rdIjZUAAVSQRlc1jsjbnPaE6rIS+p5G6dJTVqVOXsQUpvy92EjrBrbTZnFUcovjVlU07yvVkUvyILIWjbGTjE15IcmTH7iWTjjLN7XRyfYxvk1j7tt3nIJ34N8WKtypUr2W/+WyR96N+o6rjsVXdHtrRvHa+xjkx0FhQujRkY5Z6PlBdrWHLZVCZQ23j66QcCb1yVGymsWkDq3fWU/TfOECSL9/ppFOX2lI5tI5Y48a11IOFRYsh0rWPGSKiyDlFmV1qyKHjwoJt1gbVW/y9RJxarRKmJ5yXC4pM25bVW2BkhF5oB4nhUEkCqiZhLN9f7M8PtTM+hv6d6Iz5jrkp8N1PdPUEj3/do847+y8MIVhNhzlzquuUeG9vwMANn7S9O09/L885cxtl682n0zeHR0/2/wOPN9GgSW5xHXTYl0N5LyOQ0bp3axe2AHuY93Ww/hztEH7xtIQyl87DP6AO1iZVLBu3eIzIY7Bx30J1YGBPzVLnj7rJKaqtPQe7tTInuCU4n7W/shcwGmyRq21gFpk9wpADCkk/FNdRJSf+CyoiTcfFHH7szA7XT2JsY0CyENXt3pLe/oNABE4hK2bl8NtpGpa2eBAPmFqzA3scKWxsh4il64w25tAVCv/fGRv2CAITYMUA8Hd7FrU2AHmb4uoMPNWbiTztz4C2IbdBOLcWSyZsbbxL2MulB9ax/ttu6D4ydHH2rbmoW1/ThXPiPjsUJcoAAl9UwQueu/k9hI3Olb6Zh7zH3t1gc2kTQu1/NBNYVlJDydNDe7VztjevmxWz1e73L3Yr+uk642Z4rh5NPyS5o5JfdrotpBR5QKiZLR70dmbZpRbcj+9oOdlnheGWzNzPTB9+wBfWjdJ/fqEXOgH8Tw4iAV2NORTjjGyQakvBdYzX2EAbFxKWYJCJiDxVlqLSmoUn0n4QgZW7pDFlIHMYNx8AnGesYwcgoUtDb0ApOBwzubSeU2TuR1XbZljvHCASAYFz60MLbaM2AHacsrmpLIiqolS1h4xXUtxfMsJQgszfc/vvFoR5fhSCz7QiUjaacGeF5CxZFIitZKhcyQrnV0EeyGUx2tLVaElIdVssAqsAosbKlnwTCN5OB2zKkDnWhoeIFRkRRCjum5fKlqsyOwVRKRCFKFU2RcGtqKSoDYIq6WZNsDBKEzNjEvqhBqJFUXtu1CzMJ4m8QRCmfeI7atipvJmsA43HQxI5ul2KLDL14YzTlFhKT0VpTzAWBa8RKDkhodRyGs03keIYhDnJvArxxknFLCNbVqQGltlL/Ud+o4SLMIdZVzvVUAgLguqmNFuJ0GQY6vkLJ5TvfANmJLQaTF47MJiStOJDfSeuWlap5KT0+/fv35y2bwavDkZMtoYuKFouKoQs1NtDLlilmMctmO2YWMlM4UVAFHL3Q5SJ/wX4DFaD7EMzIuxK3r69OApCWYTLRL6qh/6PQlP7iA8/Luus8ZxWtbocx4ZT4u8GLQkp2oLkR17iiQCmHLBHCu8ariQFGTReW1uXQ5ZctNbzo3ThFvjj5skCfRALYAaE2z5L3RfZIF9gKJr3OpHM1HeVRiCDHY0GzsG2mmaimOhQ0IyIR1EB/tLFSO+kY8boFw6otMUZr9XMy+bssGup6RZWJagEnrzIGGwNgCMthbWEknsMPkrs6BvLAuxxfNXVEtuTPYjuiUtX4+jjG/j+iASD8fGOu59dxc60KfsnJoZv9vj07214JOQADoDFsbl9K/tC9KH8/V1UmYwiQMM+HxXrkSs9Vqm56vgfmwPSSle7gk4T1IFRExmazVFMdBjEdwwq84OVXU4mL+uH1UnhamiTVkOBh/ARDQmzTni+7Zi/SZZyjGB8dF8jC2iEueftpG6NAEP3CgDuLxmO69yy8uJkuTIw1Oa3opomIH45IuVJPKuCAXKkMrbdMcGQwpV56ba8sPx5RQk22bS3seFbtaG+WykbjIZR8QUURUgUtkhnxKw6YQKhYMHO2QFsIto5HRia5iR/5z9rVgCmstNjijaglbsViLUlR8tzE9fh0XulVL1H3Kmv9WaKYua4amm68fP3ns7Jtnzr3+GXTmpPTwPAcOeqFGWx0m8XRGd/IjxVZSRVbn/rHLVfPqa3ufdbVqLY3r2VEU35gJ3nxoBp53VEbstVtHpo6GT1zsC4zbspzhfX1R1/CfuLBvJAheDF6+7nmNU3wu9gNeTQwdKFTI0iXErrTm3YwrkNbi1eZ0WXGCwzk1CA1D60un0g6Peyq3GLQNbUcQQ3p4E2OwhbnUOAD4s9TZxMX9kLz0ykLf/ItXk75RiC8kqvsKseJM80jk/suePnJ4Muicb1/sH+pZjKfbuGKomPY/CwpMrDipINSBdYhLSEyHXE3iJVXlra21YC+EeIhLELsHQmNtY69JXLbji/Ha4dlH9Sks2waj7beW1DZ81MTbB5D2Z7Qdn6sHdaJLpmRKpmb4xwtLTvCzEp7ZBXG2wWloePW8jnMtk5GXeagcmpjl4/c63pbYCszWjqXTobEDBknWkpORXAPX6bHxrLws2+2FUPpEeilRPmEw861O0VFhbykuVNR0VoKBr+F0FAMEdAe7pB7C+kuH0h3XjLnEIt+RSE7FUhoQOYMhgvhQzSzX2cLuwNrhnKtYl4pytXu2KYlZD1v+lNmK3TS81zuJymMIQ7EznrZkO9yOotFEgl7V0XMiL+bufrldf4pLHZck1Gyqh4X63HOoGZtXVdpsdGMdx+Mq0CSud0QN/CLWTVXcGwXpykUKsc7+mlAg0i5JPC0VWyFVTSowP0zLNPHeniVZx00dm1c8cUZf69DTPCvRloGYjzjWo8hA7LkOqdnEUI2rGBBbNUsYN0maTMJNJlXUwN1C1ClUehaCdALlyxKXQeR5H27CuZvYOrgOzpYqpIxYMUtzJV2hJ7ldsn+OLZtw9BSl4kydq+L63IxG3JxZ6V3GVrwGqTJdPXTKSqKamID0zbvY6rzcC7Sqj9gSidmdsevty+EKINotxPwn4BfUTOWRacUM+uYmtl6mygaxUBroi1hjXd62cxQS29o6oZSd+6RZfpWJnmJLoXu1hBv+vp/dl1zNSfZ+uH6KTHMjzubkH2YQs4Ct1Vk6s/IXni9Wc6VC5Rvmv/MAwkgOxU8G2PJ6V926g5kwmpDD5K177jlezG6kmioPnj7rZNWUUEXr1x6rD6+mbqd/qgZJc3ttanxu4bhMKJIP+SII7cIkD/ZHTlE6ztOyXVBPidwXJ5GaZrOT3sX4VGlxeRz8jpSXFj7CVnfI6FiSZJpivpKWtGERcbI59YokoxhavtVIxQu19BlD+UHDblvTfzk6rnu2gOp/Fls3Iw3Z46ytHBoLDXmvL+u3X74urqx9/4PlVxf7a/3weDgjV8ziGz5Pg3R4HUwudBYCyF7xz93lWBDkoaHG9Ogek4mtCjNomd0fnGGaG11yuTeDKKuHZcaA2ezp5c7r3aXkRq7pk7S9ci57KJuoKuypDliyK9vBm0H/3eA7wynmeTqzVSbmYoCTcdKX//vHCY/iENq9l66xV268s91uY9DapBtsjawbQVfUVWt0zvovIC5CO8WSdaZZQ8z/e/DXv1lesAH45y/e477BevI9vTymLPQVE9OjZc49UL3T0Qk9gekbkAbu9Mliu91ekQvxUsto80hiy8YsNqYB8f5WbONt5abtaLF5JEhOBi+WmjKNxE0hMr5srU7SvdbMJ1JTus40ii51XEPMuLPXxIqtzrdPPRFJ4/kRQld2sI3al63+kioKhxnbIIVGduXNXpYkyKV0vZxXGhoAVRSniJjkIAkiRdc0Tij3L6jbcOGRN6ak4u024k1BB8lTW81J0eEz9swF+uzF2ZviPehJnj4PTu6ZF0YgpX1Ea4opKhy3a85AIjLoMIm5CUiTLbl4Iddmn5TrXK+uH02Yo5AajjHCHyD3Dlp04AhOrWP3zaJ32Nrv//DIH/+CdqIddTt3/1UzbgmbclwmwDrGp/S/LUO1CM5NI7Bu4md1oG6UiHf5RyZlM44NOsrMoQ1Qcmr0gn+rceC9EfVhNR0zsnfcrfCxuTU5MpoyYU8P1wvV7AP128m/FPQhUIUK4dyVlarS7KwU1Zv6eXM06fuQvuubJa8iX7WeF7Ug5h25D4irrQNAhohh4+A/sBnrfOYGGRRy8iqx2K9ZtYFGhFUZLpusqsDDZ6SaralnVAKSlUxCr4/1UyQSH2yA+g842gWrEP7YQgFgb5f83ZrL/CeuuS4nIp1o4lN7+/7x1i1oaSYepBuojq2BbWRdOke3CU+mt2vndp3yMGicdBbYnHS6HOJyBmPLLlanYz/+iEuWZuF2eq8+NiKU7OmpSxQO5zxVwODx/FLb6TJpP1Oxkudqk5HUTy3u0YHypSsbv/62uYyMnj7W91fhDz6Bzws0eBkCeXxCKp4/tixVlrpsjI9fns7sFaOa04zwyfI/iQPfl/480X4XZ56JxewVDYgHmKScrAp7mQnhrzoeb/+CIec7MKSvPCneEQkVnq3lnsoEb5rilfMeqCm0WFFUpCgO/UokNOic9dfnRGC1c9NJJLpkIpUnh9mtXYGjVrhK39JjY+nbd9dUeFVM3j30POCt1LUQO2Bo9+QhNbu382LSiKecvaQsDQ8vbSZSeXNo7tlkZ/VCFnDqbfyddW6Rv5rCh4RrLcCfwqNZmdDJGR4zLmFg4uHHKYpNT+GDvIqaz8qn7t1HxbBsqb0gFPHjwg0kOhmBcUw+x0QtJXIIk545C++e9eVGSoDzc2CNaLKEmhQKU6jlK5DQHL0l9GvuH6tmb0yaITZOinHyFOh5DqxpquClEnwc3j6A/GawxSc8QR/fxrrneV/63uM++B3zncO9wcnhXee4cDA5GJ8whcUrPiLMorj6NcKdjiEEcjjc6y45wlscrUMxo1PYySjeIRNaemS9vbL+0T9EcdeirsWJjBTA6tFpA+htFRcUF4pnz35WrR3VAt/1EQZu5XfuQu73Sm4YcbmGVbR4Bc+hm+P58ns/fnTg+/AdtMobilgC3f7D/VcJEkHvvTGRSjj8OR9UxMdv93ahWjQmUgu37321YQM4Npmyx91ocwI/ixSfKHOvrHzMhqpUXZ/Oc6JX7fMbj/RGPi4M3CrYqtdU9rP5R7X6w0Kd9pzgvF67RdAhGNNoxgQ6XXov+kHBbDCm1w3yV+SG+3VDvyqvT4H9I7T1rw9e9sps9w1186fP2Lh5jH9uq+Bob89KuS/0P88L3n65ywcRm8be3i2CwTFwbn8SvVdA/2uwh+8yMtgr8O1NVRZpNUuWyxMUr9X6VdTB8xP9IABRjkgaJU53i5UmooeCqcOfx6PjE9vbE+PR+KN4HeE+YQo6OygzICAzKBs9hXDhlA4/hkd3aKs1lRWaGm0HOilS5KYJqfKZIuvv957iU4k0ES6AR/5QAUaL2TmClWMobDriw5tSjgAapkaD0z44D+Q2StiVi5FjqGy0HF2eBqLc7pKzoCqAEqCAAXFgkJ0dMLhxHFbvoyktk2Plfho5Ru6r09M1MA89gl5uVFis/c6Wky7hP6WVV136PV56cQuHGQekr8JcgOxZs7O6QqmsUAvZUSuU6lSa0xVHBcfYnnPmHDNXcxZe3yg3TjJX5M+ocDLmXqbYfi14HGnBr979Lfs62DWH7blNsLXC9vGNKLMwd+Z1zfknCFhnFue6GsXz5omNrrmXec3FxnnzjOJc18uYhPrWI7t3F/HF9ivtYv+CiM3ZvTMfAy9fYS08QFfaU65qOj5BE3YO8jIaf2N8jDvsvou5rnPeLxeq6x6JTxa9UJhEgAX8rnKDxFFwY+P50j6obXEYISplIT1gVFM/iy8QizuvUvE85Tcvmu8+qo1hlaPDK+wj2N2xZVEWDUlPQ21yY7AEzgFHymdJqp27iiA/biJcewuUB7tGluCPXDckiYLDO+w4oZhWp1mBs4BYPtpY5mmR9vVJLZ5lHw0JzTlbpGWeHzGO9DYUQQAEFOI46RTJSnrBYT5LpJL6/HzT0nz81ujMzuCg/Pyg4DlEQNID6aQ8zgSStQl/PYrNcUcWLDgSF50B13xTtx1W7yd2Fca61f3Bj7dR21+emP/rrBYbjf2/xjnueUcv22eSEIsuz7KNOtSOkilLNLUuWa6h8vHR317MDfxZ9xiGbfp87EaQlRSAgC/wswCHvsUIoLO1nSlsAs8FOJ7sa8EGHsAksRad2F/ioA7Bx/tG5/o2UkscX56Qg3z5fpfnj7NhCsJ6W66Uoa+qlF4IfCebS8xLXI6GsT0j/Q2DIHSnNvxJDQfA1I7xp1UcCAZmcNkDRagMoAuXQmjHPD1dWG8ozpUYRd23zXVHRbmSy5hJSAPD67n9KB2FClDWRiCITllSDSMq1NN+6t6QQzc79ZOvXnkCY1AIggqiL53q0wxBd49APjSMVkC1QavgRDBzzg0XWipJWQOhUYHk6QTMwsdCbEIUVr1MjeahCIuxKbZEPGJ3FUH8J6JtnkF0QFqmxLggaEqUc9uzq3ZHpfZvgeHBn3soe903m5b85MQTBI2GN7GsUVUF6OfOc6A/pEY5QonjC+acdiFHUuJrJtCIq7YJ9F+X/bCJgbjBySgfFL6nmMSh+kPBzE1BgLwsEcNBuSEBLlJZZBRnCDs7hRli4zmxURWdnecxG8XnjKfImV1Sg6NkNjDgKBjh8JwY1BOwb8CVHt35jeNweeu5LzFUrTOWGqVfdkZ5bubtKaKt7lOSBrsdwO0GEg/oD/oj/IV7r7EqvJLmklxJlnhet/TV7qz+OFtQlHvJsWm4/1cI1+weOltkLoCPoshLZo7f3GAfy3qDRa9PrcDR9vK0Qbmn+Ff+YjLsMAkRVRKXmaNSHk8yPAJiEd/OoZ5fBsj8SdK9AWAFTBRTCLm68mR0F5pYDGtK4MgMSCJRq2lJauyTI1PO71/aaj1T0+ehcDm+BndGa2LLYJQAEczFkHEGbCIlcZGNgnksoFpJSpgPQdxBizCJwnQfvVNwpqDV460ykUGAmGrNemKaTfmbo0eCNjR0nLjuaOjALfrrL/UTtIC+K4A8G8VXUkawshWDtrgodiA3D8v/IdwDt2C6EeVE62UWOq0mft2dSiF1QhV52XehCjHJ5hqPjbKV6xbCyRCW3tDTrDaZDr1LUseH1qfp07T1uWN/ZdomaAwesz78KdPrRddPb9NBjA4csJ2+61qo4+apvYvDI3+6OdfZt92ad7+t88Dm0YHGJoXEUISe0j9nm5fh+lW42gfvyirh4fos2WgDy56lBko3W1W5uDV3cRI5ktQlLsxwDmclfH9+7gFVuSAFAiZ/xzxWN1OusYlk4vOpljH8xNvFMzVNUaIinqxKSGCb/mPedq53re15grmR2Njvorgk5E5xd5zBFV6S0in9loSX3yfWfVx8cNt2KFHdWZGgBurKOtRsKGlNWzAuvjev6moUd4euqt3dl5v9VUzuuP9kKmcpNRUatf6zeFJmpb+NxM2OFmACvKAHAeYccaa4q0uU6ZozRiQ0sUxxjnjM4OdyYl7cae5KzN7loCRtw5+5JlSfbNWD0QSv3+k4h7glGy82rWE8yI+9A5DfUXFqYQpqm543SVi/dK14/2iZ6VgVfUsff8ndvLuAGub2BzQD1sCFjSSKxANzuXbzIsKufa+HnpbRVDxljEjVRrM7b6hRwovQ7QfNCgewgpQub/XHnJIwoKQqWWH3eOBSu+kLFGEUlDrb8uqKcKvzhJ8xU1Ez4X9EES0DzPYBYPruVO/Ue2Ta1tcSEmJSmD8TqYEpxKL4bM5xoZ1Cfxo1K2r6xj3HT+iuD16/uQTntX7ahrIXz2sY9rqS9onYzrMVNyNWNbf+k1Txwg44Uuw93MhO/4UlCBJXenFyg+He86XXG04syrxDhyaJsmZlDtwtZZPxhyxh+9dT3gWyfGjciY0v6WJTs+TVqlIPNy7vI1ZXwSjxFd9tGnHNC8lbwROqY7psg0WFdbY/ZyJqSCYHk3RukG0cQYCn+LVxTHn3DStHo/gxfoyyF8NRiBZub7rluAWZZKNqunR2wfd9solNqY6v/5wWE0ikCWVZTFgX2MQIGkfFhdTOQ95ilK9p4jDxW/1gExQd/Qeh9Ij7P64outqyxb/YPaYTc7gZo1MS55tKY93eoLWkfMYhIC3FG8T2NgPo9uuLJUXMqd3dQeglQQa0HSEoBbXnxKIzFbj7mSk7eTaSI9cOwmhKHO2uunvL3CUdAOPvmoz4QeYbV5BocjEdt/bCGIihOeuXd3dD6r88uB3pCbMrudeeLLlxk56eT44JPk0mGHCYe6J1+gobLOOZ+ioej4VlMeTTKKzuRCkTR2Zmtthee1zoo8S8onEf7lxQ94ew8/+FO7l1jmBPgoJ0oPC2pyQtFP4Zw5ZfQTQ9BOV79zF7yoxbTq+mh3eFFYYBX7kgQawTbRFrxQlOc1tEOt/774lHbY4SXf3iwlMJCV7zyK7zxCOsI8SLhCM290HT9HfcNhE3Z6ELY2tX8L57AzcWtXwj0TzS/u0p8PtbGknxzmlTsYS8LPmCN4/ewrtZ/1K9spSehy1hZt4zij6ZDLZBmHEpmOr+GCotCH+TEvWGwc8bcXEaeeoJZXDjwdR4GVyZDLrdASAOMYeIwNcwaHSoX2RczIm6G0zCNscLdzwL0+KNyZWC1wlZev0qee0+jMlp8Z6Fdy74P9qk2vTIyT4HKo5M0sZ/SOcQCY0JFefYO+FzoOeulh56RygZeO+Ia6gZUmfNiyUwQprWHreWB6p8Mnhs9qrwUb2+rMdvUwgOiZ2XNaQ+m/niULHj+4ESAggtcDwdnSteXhTy5xPEV0PRyBFLRJZFCV79/wrpANVBJYhm89H+bWyvay4/2Vc92ccGP1fZPy8f/LB//pkMI/E/eysxRfpk/3HOF6KVdHIrdp/cR8S6YTdd6WSMH2D3GHd3MT7tiwMVdaI/vwmwbLozVvCNt1P6dGEzcyqzsuX4W8FvRq1zLUNzxTw83HabYfA4O9zqkbbugU9Vvf+sT1Oz8n0erEuTDrfVVwX/dsC+z1gshDIr5mOcCJFVA0xtjaa8PglFILnvUB1uHl7p3I5hpr6le0Z4Rq0wqkTXse4xmes8ImUx+c30DNnB8Oj8+SACv/Ck1ezyPWYkx0eZw8Tqsm5Yvv831j+FUJDXvJT3e34mbGIB4cqdzYeVODXBjYgk+qSqyvS14wNVhCiULZLioRFMX3Kowu4pvCf1v5dT9xn9HeCcNM8oz7Phc8zWUycCCy3e4PKnB/1NGjMJZ/VVSyPlKa56jwQ/xCzfrRZHd3hEAWKywdDop/2UYrBUVR3mHR4YsCDxo86/QfLQbq09841Z6/WJmhKQ4KnWhDQPT/LNvrRQG+Kh9k8gp7h+ArK+Zk6/sl9xUHmwdoS9RTGI9tlynWPgLC4kipOuXffuBc/6TPO7iwzcuWyHOCduJ3f/f/9NvgRDXdXsaALJK8Lr6sJXpNjR5EqWsMhhsrKO5UIPcS9o/7UIjXI68D6lA9Oq9WKFf1buSuCSQxbgekGNc6VHurqvaXqf+tk2uPVeXuiAV3vn6GmP8LDh7FALY9FcbylRKwfQ05p78R793qaeV6cw2XH4DqTzFnZTPMiat+Vm5+1vA99uD3Qtg45m56G7T91Q4NAZd3cIcJGqDTAn6iwKiTqLJoN5cbfv62ITFjSEG9Tib9HtfTFtbTGJoercF3/PSaXqpdrMyY3njQcyNa58XQov6ltg3v3yC1PzM2VqPQ2E+fIgcOnC3n4HBVnmBCCIOW2Xs/20Za0YjI0wEI9HuDSYBnnbFV65eWMle+XyZZ0tm4xwMJt4l+jphmQtK+i83a5kAyXULDaYVd7RfukcE7+0uJCfzn6tau8GU4KpXhUxfj+3k/nFZSZ+BjvKT+VdpJVY/9NUaVT1XURW1VEdIiRosqWRUrfoTEcoTzOalIKSFIqW8pKi4Wjcoz9N1XxSNsk/4H6pL6QVFoYHmxUlTQK1Q4ZvqtlrmzQrPWvFxwwdqptaxscVqQ5Jt3mZfVMzHNSCJkVJsNnGydUcj/ztGLLbePGXxl3z6+I+OzZW+wM0AwBIiLIZjIDy0wyUQGg0nju3RWOrt4+dURJuVoSaw0p/hpVo3ebQkrCfpWE+FObwkhmx9npbzaFz5wVtvIxYabS7e7Q0dhcR0KBz1rueM2cCEIDYDYl8RThhvujetJLM9EacKMSJfG8N+5PpjnRyN+A58kLXPU9I8KsF/J8QoyqrpO3sf4Th4vxIJbkuP5gGq6D/1J8g2Fv1c0GLkkZYYFB++lwvKstThdR7tWtydt4QonKtTzsN1G4awq3wS8TRfWkI2qTpgecqXswP4pgdwo0Mg03P/Vqbypac9EqW0inyeKTjic0LFqw9+0Vlu8tRHzEzPae6tYY5GNYCQRh0Pa5HfoKwuTjxWGfnscTLREKTDgSsexsdnSvOFp41ZNYlS8S5wuyzQEAzWcxTQv/SZgzNuPLB7T7uwhknCo2KgqPy8iMBlc7hTRTBHR2QCUVKPWhLpVPhxWdGlyJUPru38fMu5N07ZBd5sAxwEeXPL1crCgkpIkVbNBGKc0ikCPIcXDLEpPSv/OMd8xCtgWumbe6u+T8XXG1tK5Y0lLrNemxM9KnV6LxSOLHO/8M3ItRoo7/MXjqVV3V6Eo6gq1NpKmdpqrSJrlqVtmqWtvLKdSAE4jppnYCzqGFrZq5GTj6UIDRptLSQ9d9YpVvlWONkPz8ntx5+AOEC3tuxJj6RDTvnx0929CTcxwfyu8xsZmSZ7Ufbg7aPWP/YPvR9f2IB32doHHHRV77R2KhusLGxqBuNRn4CnoTDWhqWbIuzs27kuLY9aY+PgJnW71brP9bmANYhJxG1bh5wDolODziBaAafcw8JqBiRRAXsfUoRhfVNWVDeyFaNfdw6JAIAAJDj8ANt3MGMQbS0vNJy12ZEbA2jOSGkBYp8Ixg1iIzius1UASLC+IXGkaq0VCbVL8SJtGdu8ROpZnXm044iESCxTGU9+LiZiCB2yQXEu4peLTJ2yR1Epvfykj0TtQRpBQAAFIB/aMZaw0gB2M/bh/hb/zXoWxp9oYmqzaceIhxaFgQfAgAAZAU8VTNWcEaadPMHcgixZ91pSkk3FkTqRNKHHZepMWgFkgSDH+tDeIOPeIREjbuhA8H+c0pLYHZBfHceNfQbjvg/LKMeXJ7b7uPuIMG3o48C8CfGoq1CQA4GiWx0MoG7Mql/PRkOQDDqJqfIqbW+iWdegutknfEuiDATTEqFWYJyk9B3iU6e1WLa4/DK+q94kxNpUrp0w0ODwW/ANGAAAAEtAMC/rOzHAA/lUsqkFl2Cey+FHvfBAqdYQAAO8HlUF3cBDYjAV8AAHAgTCEAKdMsmAiaoAgiAUHgAgBi0aQIEaGBAgAEFHBIQQAOjPKrLLQENbMErAQNo4F+BANIgsjsiEOv284siGE7OL46CcGSZ+Rf3J6ZeQIvG/EVthFHu6iXLjv+BjHoJh/ZKN7Pookp1362bhqWIm1XuGOyUzebPs7cZ5/kUpK6+KILh5PjF3TwF4ThrS7/3fmLqBZSS/6tpM0T94jtXJxcK/gdlqkkKktxe6cZ0LTqHqD6uOt8fNSxvpjgz3rhjeNNPcglj/nRGs4q09FR9aR2QFKjdZO3FBxcgQYEGAxY8wL9R+tUBBwQBhBCNJ9PZfLFc5fWNza3tnd29/YPDo+OT07Pzi8ur65vbu/uHx6fnl9e3d4PiNJEdiZtBUqhjAU4dEh49me/hgbaN8NwVCY+hGfXDvOx8kbSrQGWISsjTVlv7iL2UFhSRtzDT4U7ALfd9haXz/o3kZfRUyHE7TNIX4t3rhv92oU083DveSbf6jSGDbZ7PMUJAL/I42JvMUPf/M+X+JasHHgwEweVg0o1AxkL8wIl4nCT0imybFocgOYc0JLIC/qP1lJB3RbiEwolRZMgdeNL2HoX0ug9SRPdiGfUYZF6UUrZ90l5xiwvuGHrqmz5vea5DQ9CQDxVbkxE+A9dYrCJI7n708sClA+8mMDxACNLZxpCwJ9Fll4UVbmR1tQI=) format("woff2"),url(/assets/fonts/iconfont.938fa69e.woff) format("woff"),url(/assets/fonts/iconfont.ecabaf00.ttf) format("truetype")}.iconfont{font-family:iconfont!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.reco-reddit:before{content:"\e701"}.reco-instagram:before{content:"\e6fc"}.reco-language:before{content:"\e65e"}.reco-bitbucket:before{content:"\eb57"}.reco-faq:before{content:"\e643"}.reco-lock:before{content:"\e60f"}.reco-sticky:before{content:"\e62b"}.reco-blog:before{content:"\e61d"}.reco-mail:before{content:"\e624"}.reco-friend:before{content:"\e62f"}.reco-rss:before{content:"\f09d"}.reco-fullscreen:before{content:"\e602"}.reco-api:before{content:"\e662"}.reco-jianshu:before{content:"\e60c"}.reco-mayun:before{content:"\e6d0"}.reco-weibo:before{content:"\e612"}.reco-bilibili:before{content:"\e630"}.reco-douyin:before{content:"\e654"}.reco-v2ex:before{content:"\e62a"}.reco-csdn:before{content:"\e609"}.reco-juejin:before{content:"\e613"}.reco-wechat:before{content:"\e720"}.reco-qq:before{content:"\e67b"}.reco-facebook:before{content:"\e606"}.reco-twitter:before{content:"\e60b"}.reco-zhihu:before{content:"\e605"}.reco-douban:before{content:"\e603"}.reco-taobao:before{content:"\e6a5"}.reco-toutiao:before{content:"\e6b7"}.reco-linkedin:before{content:"\e668"}.reco-document:before{content:"\e67a"}.reco-sf:before{content:"\e610"}.reco-coding:before{content:"\e601"}.reco-gitlab:before{content:"\e63c"}.reco-suggestion:before{content:"\e608"}.reco-tongzhi:before{content:"\e764"}.reco-huawei:before{content:"\e6b9"}.reco-beian:before{content:"\e667"}.reco-color:before{content:"\eae9"}.reco-other:before{content:"\e60e"}.reco-copyright:before{content:"\ef87"}.reco-theme:before{content:"\e7e8"}.reco-eye:before{content:"\e669"}.reco-menu:before{content:"\e67c"}.reco-up:before{content:"\e68b"}.reco-npm:before{content:"\e88d"}.reco-search:before{content:"\e611"}.reco-message:before{content:"\e634"}.reco-three:before{content:"\e644"}.reco-github:before{content:"\e628"}.reco-bokeyuan:before{content:"\e626"}.reco-date:before{content:"\e63b"}.reco-account:before{content:"\e607"}.reco-category:before{content:"\e61e"}.reco-home:before{content:"\e65b"}.reco-tag:before{content:"\e633"}.content{margin:4rem auto 0;max-width:800px;padding:0 2rem}.mod_404 .desc .desc_link{display:inline-block;background:#424242!important;color:#fff;padding:6px 20px!important;text-decoration:none!important;border-radius:4px}@media screen and (max-width:720px){.mod_404 .desc{margin:50px 0}.mod_404 .wrapper{margin:0!important;padding-top:20px}}code[class*=language-],pre[class*=language-]{color:#ccc;background:none;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#2d2d2d}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.block-comment,.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#999}.token.punctuation{color:#ccc}.token.attr-name,.token.deleted,.token.namespace,.token.tag{color:#e2777a}.token.function-name{color:#6196cc}.token.boolean,.token.function,.token.number{color:#f08d49}.token.class-name,.token.constant,.token.property,.token.symbol{color:#f8c555}.token.atrule,.token.builtin,.token.important,.token.keyword,.token.selector{color:#cc99cd}.token.attr-value,.token.char,.token.regex,.token.string,.token.variable{color:#7ec699}.token.entity,.token.operator,.token.url{color:#67cdcc}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:green}.categories-wrapper[data-v-1e68bc8d]{max-width:860px;margin:0 auto;padding:4.6rem 2.5rem 0}.categories-wrapper .category-wrapper[data-v-1e68bc8d]{list-style:none;padding-left:0}.categories-wrapper .category-wrapper .category-item[data-v-1e68bc8d]{vertical-align:middle;margin:4px 8px 10px;display:inline-block;cursor:pointer;border-radius:.25rem;font-size:13px;box-shadow:var(--box-shadow);transition:all .5s;background-color:var(--background-color)}.categories-wrapper .category-wrapper .category-item.active[data-v-1e68bc8d],.categories-wrapper .category-wrapper .category-item[data-v-1e68bc8d]:hover{background:#3eaf7c}.categories-wrapper .category-wrapper .category-item.active a span.category-name[data-v-1e68bc8d],.categories-wrapper .category-wrapper .category-item:hover a span.category-name[data-v-1e68bc8d]{color:#fff}.categories-wrapper .category-wrapper .category-item.active a span.category-name .post-num[data-v-1e68bc8d],.categories-wrapper .category-wrapper .category-item:hover a span.category-name .post-num[data-v-1e68bc8d]{color:#3eaf7c}.categories-wrapper .category-wrapper .category-item a[data-v-1e68bc8d]{display:flex;box-sizing:border-box;width:100%;height:100%;padding:8px 14px;justify-content:space-between;align-items:center;color:#666}.categories-wrapper .category-wrapper .category-item a .post-num[data-v-1e68bc8d]{margin-left:4px;width:1.2rem;height:1.2rem;text-align:center;line-height:1.2rem;border-radius:.25rem;font-size:.7rem;color:#fff}@media (max-width:719px){.categories-wrapper[data-v-1e68bc8d]{padding:4.6rem 1rem 0}.page-edit .edit-link[data-v-1e68bc8d]{margin-bottom:.5rem}.page-edit .last-updated[data-v-1e68bc8d]{font-size:.8em;float:none;text-align:left}}.content__default code{color:#505050;padding:.25rem .5rem;margin:0;font-size:.85em;background-color:var(--code-color);border-radius:3px}.content__default code .token.deleted{color:#ec5975}.content__default code .token.inserted{color:#3eaf7c}.content__default pre,.content__default pre[class*=language-]{line-height:1.4;padding:1.25rem 1.5rem;margin:.85rem 0;background-color:#282c34;border-radius:6px;overflow:auto}.content__default pre[class*=language-] code,.content__default pre code{color:#fff;padding:0;background-color:transparent;border-radius:0}div[class*=language-]{position:relative;background-color:#282c34;border-radius:6px}div[class*=language-] .highlight-lines{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;padding-top:1.3rem;position:absolute;top:0;left:0;width:100%;line-height:1.4}div[class*=language-] .highlight-lines .highlighted{background-color:rgba(0,0,0,.66)}div[class*=language-] pre,div[class*=language-] pre[class*=language-]{background:transparent;position:relative;z-index:1}div[class*=language-]:before{position:absolute;z-index:3;top:.8em;right:1em;font-size:.75rem;color:hsla(0,0%,100%,.4)}div[class*=language-]:not(.line-numbers-mode) .line-numbers-wrapper{display:none}div[class*=language-].line-numbers-mode .highlight-lines .highlighted{position:relative}div[class*=language-].line-numbers-mode .highlight-lines .highlighted:before{content:" ";position:absolute;z-index:3;left:0;top:0;display:block;width:2.5rem;height:100%;background-color:rgba(0,0,0,.66)}div[class*=language-].line-numbers-mode pre{padding-left:3.5rem;vertical-align:middle}div[class*=language-].line-numbers-mode .line-numbers-wrapper{position:absolute;top:0;width:2.5rem;text-align:center;color:hsla(0,0%,100%,.3);padding:1.25rem 0;line-height:1.4}div[class*=language-].line-numbers-mode .line-numbers-wrapper .line-number,div[class*=language-].line-numbers-mode .line-numbers-wrapper br{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}div[class*=language-].line-numbers-mode .line-numbers-wrapper .line-number{position:relative;z-index:4;font-size:.85em}div[class*=language-].line-numbers-mode:after{content:"";position:absolute;z-index:2;top:0;left:0;width:2.5rem;height:100%;border-radius:6px 0 0 6px;border-right:1px solid rgba(0,0,0,.66);background-color:#282c34}div[class~=language-js]:before{content:"js"}div[class~=language-ts]:before{content:"ts"}div[class~=language-html]:before{content:"html"}div[class~=language-md]:before{content:"md"}div[class~=language-vue]:before{content:"vue"}div[class~=language-css]:before{content:"css"}div[class~=language-sass]:before{content:"sass"}div[class~=language-scss]:before{content:"scss"}div[class~=language-less]:before{content:"less"}div[class~=language-stylus]:before{content:"stylus"}div[class~=language-go]:before{content:"go"}div[class~=language-java]:before{content:"java"}div[class~=language-c]:before{content:"c"}div[class~=language-sh]:before{content:"sh"}div[class~=language-yaml]:before{content:"yaml"}div[class~=language-py]:before{content:"py"}div[class~=language-docker]:before{content:"docker"}div[class~=language-dockerfile]:before{content:"dockerfile"}div[class~=language-makefile]:before{content:"makefile"}div[class~=language-javascript]:before{content:"js"}div[class~=language-typescript]:before{content:"ts"}div[class~=language-markup]:before{content:"html"}div[class~=language-markdown]:before{content:"md"}div[class~=language-json]:before{content:"json"}div[class~=language-ruby]:before{content:"rb"}div[class~=language-python]:before{content:"py"}div[class~=language-bash]:before{content:"sh"}div[class~=language-php]:before{content:"php"}.custom-block .title{font-weight:600;margin-bottom:-.4rem}.custom-block.danger,.custom-block.tip,.custom-block.warning{padding:.1rem 1.5rem;border-left-width:.5rem;border-left-style:solid;margin:1rem 0}.custom-block.tip{background-color:var(--code-color);border-color:#67cc86}.custom-block.tip .title{color:#67cc86}.custom-block.warning{background-color:var(--code-color);border-color:#fb9b5f}.custom-block.warning .title{color:#fb9b5f}.custom-block.danger{background-color:var(--code-color);border-color:#f26d6d}.custom-block.danger .title{color:#f26d6d}.custom-block.right{color:rgba(0,0,0,.4);font-size:.9rem;text-align:right}.custom-block.theorem{margin:1rem 0;padding:.1rem 1.5rem;border-radius:.4rem;background-color:var(--code-color)}.custom-block.theorem .title{font-weight:700}.custom-block.details{display:block;position:relative;border-radius:2px;margin:1em 0;padding:1rem;background-color:var(--code-color)}.custom-block.details h4{margin-top:0}.custom-block.details figure:last-child,.custom-block.details p:last-child{margin-bottom:0;padding-bottom:0}.custom-block.details summary{outline:none;cursor:pointer}.arrow{display:inline-block;width:0;height:0}.arrow.up{border-bottom:6px solid var(--text-color-sub)}.arrow.down,.arrow.up{border-left:4px solid transparent;border-right:4px solid transparent}.arrow.down{border-top:6px solid var(--text-color-sub)}.arrow.right{border-left:6px solid var(--text-color-sub)}.arrow.left,.arrow.right{border-top:4px solid transparent;border-bottom:4px solid transparent}.arrow.left{border-right:6px solid var(--text-color-sub)}.content__default:not(.custom){max-width:860px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.content__default:not(.custom){padding:2rem}}@media (max-width:419px){.content__default:not(.custom){padding:1.5rem}}.table-of-contents .badge{vertical-align:middle}body,html{padding:0;margin:0}body{font-family:Ubuntu,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:15px;color:var(--text-color);background-color:var(--background-color)}.page,.password-wrapper-in{overflow-x:hidden;margin-left:18rem}.navbar{z-index:20;right:0;height:3.6rem;box-sizing:border-box}.navbar,.sidebar-mask{position:fixed;top:0;left:0}.sidebar-mask{z-index:9;width:100vw;height:100vh;display:none;background-color:rgba(0,0,0,.65)}.sidebar{font-size:16px;background-color:var(--background-color);width:18rem;position:fixed;z-index:10;margin:0;top:3.6rem;left:0;bottom:0;box-sizing:border-box;border-right:1px solid var(--border-color);overflow-y:auto}.content__default:not(.custom) a:hover{text-decoration:underline}.content__default:not(.custom) p.demo{padding:1rem 1.5rem;border:1px solid #ddd;border-radius:4px}.content__default:not(.custom) img{max-width:100%}.content__default:not(.custom) :first-child{margin-top:0}.content__default.custom{padding:0;margin:0}.abstract img,.content__default.custom img{max-width:100%}a{font-weight:500;text-decoration:none}a,p a code{color:#3eaf7c}p a code{font-weight:400}kbd{background:#eee;border:.15rem solid #ddd;border-bottom:.25rem solid #ddd;border-radius:.15rem;padding:0 .15em}blockquote{font-size:.9rem;color:#999;border-left:.25rem solid #999;background-color:var(--code-color);margin:.5rem 0;padding:.25rem 0 .25rem 1rem}blockquote>p{margin:0}ol,ul{padding-left:1.2em}strong{font-weight:600}h1,h2,h3,h4,h5,h6{font-weight:500;line-height:1.25}.content__default:not(.custom)>h1,.content__default:not(.custom)>h2,.content__default:not(.custom)>h3,.content__default:not(.custom)>h4,.content__default:not(.custom)>h5,.content__default:not(.custom)>h6{margin-top:-1.5rem;padding-top:3.6rem;margin-bottom:1rem}.content__default:not(.custom)>h1:first-child,.content__default:not(.custom)>h2:first-child,.content__default:not(.custom)>h3:first-child,.content__default:not(.custom)>h4:first-child,.content__default:not(.custom)>h5:first-child,.content__default:not(.custom)>h6:first-child{margin-top:-3.5rem}h1{font-size:1.6rem}h2{font-size:1.4rem}h3{font-size:1.2rem}a.header-anchor{font-size:.85em;float:left;margin-left:-.87em;padding-right:.23em;margin-top:.125em;opacity:0}a.header-anchor:hover{text-decoration:none}.line-number,code,kbd{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}ol,p,ul{line-height:2.2}hr{border:0;border-top:1px solid var(--border-color)}table{border-collapse:collapse;margin:1rem 0;display:block;overflow-x:auto}tr{border-top:1px solid var(--border-color)}tr:nth-child(2n){background-color:var(--code-color)}td,th{border:1px solid var(--border-color);padding:.6em 1em}.theme-container.sidebar-open .sidebar-mask{display:block}.theme-container.no-navbar .content__default:not(.custom)>h1,.theme-container.no-navbar h2,.theme-container.no-navbar h3,.theme-container.no-navbar h4,.theme-container.no-navbar h5,.theme-container.no-navbar h6{margin-top:1.5rem;padding-top:0}.theme-container.no-navbar .sidebar{top:0}@media (min-width:720px){.theme-container.no-sidebar .sidebar{display:none}.theme-container.no-sidebar .page,.theme-container.no-sidebar .password-wrapper-in{margin-left:0}}@media (max-width:959px){.sidebar{font-size:15px;width:14.76rem}.page,.password-wrapper-in{margin-left:14.76rem}}@media (max-width:719px){.sidebar{top:0;padding-top:3.6rem;transform:translateX(-100%);transition:transform .2s ease}.page,.password-wrapper-in{margin-left:0}.theme-container.sidebar-open .sidebar{transform:translateX(0)}.theme-container.no-navbar .sidebar{padding-top:0}.password-shadow{padding-left:0}}@media (max-width:419px){h1{font-size:1.9rem}.content__default div[class*=language-]{margin:.85rem -1.5rem;border-radius:0}}.iconfont{font-family:iconfont,Ubuntu,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif!important;font-size:13px;color:var(--text-color-sub)}::-webkit-scrollbar{width:5px;height:5px}::-webkit-scrollbar-thumb:vertical{height:5px;background-color:#3eaf7c}::-webkit-scrollbar-thumb:horizontal{width:5px;background-color:#3eaf7c}.vuepress-flowchart{overflow:auto}.sw-update-popup{border-radius:.25rem!important;box-shadow:var(--box-shadow)!important;color:var(--text-color)!important;background:var(--background-color)!important;border:none!important}.sw-update-popup>button{background:#3eaf7c;border-radius:.25rem;color:#fff;-webkit-tap-highlight-color:rgba(0,0,0,0);border:none}.tag-wrapper[data-v-25a0fadc]{max-width:860px;margin:0 auto;padding:4.6rem 2.5rem 0}@media (max-width:719px){.tag-wrapper[data-v-25a0fadc]{padding:4.6rem 1rem 0}}.tags-wrapper[data-v-615c9794]{max-width:860px;margin:0 auto;padding:4.6rem 2.5rem 0}@media (max-width:719px){.tags-wrapper[data-v-615c9794]{padding:5rem .6rem 0}}.timeline-wrapper[data-v-42b59284]{max-width:860px;margin:0 auto;padding:4.6rem 2.5rem 0}.timeline-wrapper .timeline-content[data-v-42b59284]{box-sizing:border-box;position:relative;list-style:none}.timeline-wrapper .timeline-content[data-v-42b59284]:after{content:" ";position:absolute;top:14px;left:0;z-index:-1;margin-left:-2px;width:4px;height:100%;background:var(--border-color)}.timeline-wrapper .timeline-content .desc[data-v-42b59284],.timeline-wrapper .timeline-content .year[data-v-42b59284]{position:relative;color:var(--text-color);font-size:16px}.timeline-wrapper .timeline-content .desc[data-v-42b59284]:before,.timeline-wrapper .timeline-content .year[data-v-42b59284]:before{content:" ";position:absolute;z-index:2;left:-20px;top:50%;margin-left:-4px;margin-top:-4px;width:8px;height:8px;background:var(--background-color);border:1px solid var(--border-color);border-radius:50%}.timeline-wrapper .timeline-content .year[data-v-42b59284]{margin:80px 0 0;color:var(--text-color);font-weight:700;font-size:26px}.timeline-wrapper .timeline-content .year-wrapper[data-v-42b59284]{padding-left:0!important}.timeline-wrapper .timeline-content .year-wrapper li[data-v-42b59284]{display:flex;padding:30px 0 10px;list-style:none;border-bottom:1px dashed var(--border-color);position:relative}.timeline-wrapper .timeline-content .year-wrapper li:hover .date[data-v-42b59284]{color:#3eaf7c}.timeline-wrapper .timeline-content .year-wrapper li:hover .date[data-v-42b59284]:before{background:#3eaf7c}.timeline-wrapper .timeline-content .year-wrapper li:hover .title[data-v-42b59284]{color:#3eaf7c}.timeline-wrapper .timeline-content .year-wrapper li .date[data-v-42b59284]{width:40px;line-height:30px;color:var(--text-color-sub);font-size:12px}.timeline-wrapper .timeline-content .year-wrapper li .date[data-v-42b59284]:before{content:" ";position:absolute;left:-18px;top:41px;width:6px;height:6px;margin-left:-4px;background:var(--background-color);border-radius:50%;border:1px solid var(--border-color);z-index:2}.timeline-wrapper .timeline-content .year-wrapper li .title[data-v-42b59284]{line-height:30px;color:var(--text-color-sub);font-size:16px;cursor:pointer}@media (max-width:719px){.timeline-wrapper[data-v-42b59284]{margin:0 1.2rem}} \ No newline at end of file diff --git a/assets/fonts/iconfont.938fa69e.woff b/assets/fonts/iconfont.938fa69e.woff new file mode 100644 index 0000000..d2e44dc Binary files /dev/null and b/assets/fonts/iconfont.938fa69e.woff differ diff --git a/assets/fonts/iconfont.ecabaf00.ttf b/assets/fonts/iconfont.ecabaf00.ttf new file mode 100644 index 0000000..eb85b12 Binary files /dev/null and b/assets/fonts/iconfont.ecabaf00.ttf differ diff --git a/assets/img/bg.2cfdbb33.svg b/assets/img/bg.2cfdbb33.svg new file mode 100644 index 0000000..f576b34 --- /dev/null +++ b/assets/img/bg.2cfdbb33.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/js/1.e2979132.js b/assets/js/1.e2979132.js new file mode 100644 index 0000000..7cc957e --- /dev/null +++ b/assets/js/1.e2979132.js @@ -0,0 +1,8 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[1],{490:function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));n(44),n(45);var o=n(96);function r(){var e=Object(o.d)();if(!e)throw new Error("must be called in setup");return e||{}}},491:function(e,t,n){"use strict";n.d(t,"b",(function(){return g})),n.d(t,"a",(function(){return y}));var o=n(547),r=n.n(o),a=n(25),i=n(26),s=n(168),c=n(167),l=n(108),u=(n(265),n(8),n(162),n(93),n(27),n(63),n(64),n(160),n(548),n(509),n(1)),f=n(7),d=function(e,t,n,o){var r,a=arguments.length,i=a<3?t:null===o?o=Object.getOwnPropertyDescriptor(t,n):o;if("object"===("undefined"==typeof Reflect?"undefined":Object(l.a)(Reflect))&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,t,n,o);else for(var s=e.length-1;s>=0;s--)(r=e[s])&&(i=(a<3?r(i):a>3?r(t,n,i):r(t,n))||i);return a>3&&i&&Object.defineProperty(t,n,i),i},p=/^(\w+)\-/,h=function(e){Object(s.a)(n,e);var t=Object(c.a)(n);function n(){return Object(a.a)(this,n),t.apply(this,arguments)}return Object(i.a)(n,[{key:"getClass",value:function(e){return p.test(e)?e.replace(p,(function(){return"reco"===(arguments.length<=1?void 0:arguments[1])?"iconfont ".concat(arguments.length<=0?void 0:arguments[0]):"".concat(arguments.length<=1?void 0:arguments[1]," ").concat(arguments.length<=0?void 0:arguments[0])})):e}},{key:"go",value:function(e){""!==e&&window.open(e)}},{key:"render",value:function(){var e=arguments[0];return e("i",r()([{},{class:this.getClass(this.icon),on:{click:this.go.bind(this,this.link)}}]),[this.$slots.default])}}]),n}(u.default.extend({props:{icon:{type:String,default:""},link:{type:String,default:""}}})),g=h=d([f.b],h),v=n(17),m=function(e,t,n,o){var r,a=arguments.length,i=a<3?t:null===o?o=Object.getOwnPropertyDescriptor(t,n):o;if("object"===("undefined"==typeof Reflect?"undefined":Object(l.a)(Reflect))&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,t,n,o);else for(var s=e.length-1;s>=0;s--)(r=e[s])&&(i=(a<3?r(i):a>3?r(t,n,i):r(t,n))||i);return a>3&&i&&Object.defineProperty(t,n,i),i},b=function(e){Object(s.a)(n,e);var t=Object(c.a)(n);function n(){return Object(a.a)(this,n),t.apply(this,arguments)}return Object(i.a)(n,[{key:"setStyle",value:function(e){e.style.transition="transform ".concat(this.duration,"s ease-in-out ").concat(this.delay,"s, opacity ").concat(this.duration,"s ease-in-out ").concat(this.delay,"s"),e.style.transform=this.transform[0],e.style.opacity=0}},{key:"unsetStyle",value:function(e){e.style.transform=this.transform[1],e.style.opacity=1}},{key:"render",value:function(){var e=arguments[0];return e("transition",{attrs:Object(v.a)({},{name:"module"}),on:Object(v.a)({},{enter:this.setStyle,appear:this.setStyle,"before-leave":this.setStyle,"after-appear":this.unsetStyle,"after-enter":this.unsetStyle})},[this.$slots.default])}}]),n}(u.default.extend({props:{delay:{type:String,default:"0"},duration:{type:String,default:".25"},transform:{type:Array,default:function(){return["translateY(-20px)","translateY(0)"]}}}})),y=b=m([f.b],b)},504:function(e,t,n){"use strict";n(90);t.a={data:function(){return{recoShowModule:!1}},mounted:function(){this.recoShowModule=!0},watch:{$route:function(e,t){var n=this;e.path!==t.path&&(this.recoShowModule=!1,setTimeout((function(){n.recoShowModule=!0}),200))}}}},507:function(e,t,n){"use strict";n(8),n(39),n(49),n(65);var o=n(159),r=(n(264),n(17)),a=(n(512),n(491)),i=n(490),s=Object(o.b)({components:{RecoIcon:a.b},setup:function(e,t){var n=Object(i.a)(),a=Object(o.f)({query:"",focused:!1,focusIndex:0,placeholder:void 0}),s=Object(o.a)((function(){return a.focused&&l.value&&l.value.length})),c=function(e){for(var t in n.$site.locales||{})if("/"!==t&&0===e.path.indexOf(t))return t;return"/"},l=Object(o.a)((function(){var e=a.query.trim().toLowerCase();if(e){for(var t=n.$site.pages,o=n.$site.themeConfig.searchMaxSuggestions,r=n.$localePath,i=function(t){return t&&t.title&&t.title.toLowerCase().indexOf(e)>-1},s=[],l=0;l=o);l++){var u=t[l];if(c(u)===r)if(i(u))s.push(u);else if(u.headers)for(var f=0;f=o);f++){var d=u.headers[f];i(d)&&s.push(Object.assign({},u,{path:u.path+"#"+d.slug,header:d}))}}return s}})),u=Object(o.a)((function(){return(n.$site.themeConfig.nav||[]).length+(n.$site.repo?1:0)<=2}));return Object(r.a)({showSuggestions:s,suggestions:l,alignRight:u,onUp:function(){s.value&&(a.focusIndex>0?a.focusIndex--:a.focusIndex=l.value.length-1)},onDown:function(){s.value&&(a.focusIndex "+e._s(t.header.title))]):e._e()])])})),0):e._e()],1)}),[],!1,null,null,null).exports,u=(n(552),Object(c.a)({},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"sidebar-button",on:{click:function(t){return e.$emit("toggle-sidebar")}}},[n("svg",{staticClass:"icon",attrs:{xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",role:"img",viewBox:"0 0 448 512"}},[n("path",{attrs:{fill:"currentColor",d:"M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"}})])])}),[],!1,null,null,null).exports),f=n(66),d=(n(92),n(27),n(64),n(121),n(160),n(553),n(509),n(123),n(63),n(269),n(270),n(271),n(164),n(272),n(510)),p=n(544),h=Object(o.b)({components:{NavLink:d.a,DropdownTransition:p.a,RecoIcon:a.b},props:{item:{required:!0}},setup:function(e,t){var n=Object(o.g)(!1);return{open:n,toggle:function(){n.value=!n.value}}}}),g=(n(555),Object(c.a)(h,(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"dropdown-wrapper",class:{open:e.open}},[n("a",{staticClass:"dropdown-title",on:{click:e.toggle}},[n("span",{staticClass:"title"},[n("reco-icon",{attrs:{icon:""+e.item.icon}}),e._v("\n "+e._s(e.item.text)+"\n ")],1),e._v(" "),n("span",{staticClass:"arrow",class:e.open?"down":"right"})]),e._v(" "),n("DropdownTransition",[n("ul",{directives:[{name:"show",rawName:"v-show",value:e.open,expression:"open"}],staticClass:"nav-dropdown"},e._l(e.item.items,(function(t,o){return n("li",{key:t.link||o,staticClass:"dropdown-item"},["links"===t.type?n("h4",[e._v(e._s(t.text))]):e._e(),e._v(" "),"links"===t.type?n("ul",{staticClass:"dropdown-subitem-wrapper"},e._l(t.items,(function(e){return n("li",{key:e.link,staticClass:"dropdown-subitem"},[n("NavLink",{attrs:{item:e}})],1)})),0):n("NavLink",{attrs:{item:t}})],1)})),0)])],1)}),[],!1,null,null,null).exports),v=n(50),m=Object(o.b)({components:{NavLink:d.a,DropdownLink:g,RecoIcon:a.b},setup:function(e,t){var n=Object(i.a)(),r=Object(o.a)((function(){return n.$themeLocaleConfig.nav||n.$themeConfig.nav||[]})),a=Object(o.a)((function(){var e=n.$site.locales||{};if(e&&Object.keys(e).length>1){var t=n.$page.path,o=n.$router.options.routes,a=n.$themeConfig.locales||{},i={text:n.$themeLocaleConfig.selectText||"Languages",items:Object.keys(e).map((function(r){var i,s=e[r],c=a[r]&&a[r].label||s.lang;return s.lang===n.$lang?i=t:(i=t.replace(n.$localeConfig.path,r),o.some((function(e){return e.path===i}))||(i=r)),{text:c,link:i}}))};return[].concat(Object(f.a)(r.value),[i])}var s=n.$themeConfig.blogConfig||{},c=r.value.some((function(e){return!s.category||e.text===(s.category.text||"分类")})),l=r.value.some((function(e){return!s.tag||e.text===(s.tag.text||"标签")}));if(!c&&Object.hasOwnProperty.call(s,"category")){var u=s.category,d=n.$categories;r.value.splice(parseInt(u.location||2)-1,0,{items:d.list.map((function(e){return e.link=e.path,e.text=e.name,e})),text:u.text||n.$recoLocales.category,type:"links",icon:"reco-category"})}if(!l&&Object.hasOwnProperty.call(s,"tag")){var p=s.tag;r.value.splice(parseInt(p.location||3)-1,0,{link:"/tag/",text:p.text||n.$recoLocales.tag,type:"links",icon:"reco-tag"})}return r.value})),s=Object(o.a)((function(){return(n.nav||[]).map((function(e){return Object.assign(Object(v.j)(e),{items:(e.items||[]).map(v.j)})}))})),c=Object(o.a)((function(){var e=n.$themeConfig.repo;return e?/^https?:/.test(e)?e:"https://github.com/".concat(e):""})),l=Object(o.a)((function(){if(!n.repoLink)return"";if(n.$themeConfig.repoLabel)return n.$themeConfig.repoLabel;for(var e=n.repoLink.match(/^https?:\/\/[^/]+/)[0],t=["GitHub","GitLab","Bitbucket"],o=0;o=18?"dark":"light")}}else w(e)}var C={name:"ModeOptions",data:function(){return{modeOptions:[{mode:"dark",title:"dark"},{mode:"auto",title:"auto"},{mode:"light",title:"light"}],currentMode:"auto"}},mounted:function(){this.currentMode=localStorage.getItem("mode")||this.$themeConfig.mode||"auto";var e=this;window.matchMedia("(prefers-color-scheme: dark)").addListener((function(){"auto"===e.$data.currentMode&&O(e.$data.currentMode)})),window.matchMedia("(prefers-color-scheme: light)").addListener((function(){"auto"===e.$data.currentMode&&O(e.$data.currentMode)})),O(this.currentMode)},methods:{selectMode:function(e){e!==this.currentMode&&(this.currentMode=e,O(e),localStorage.setItem("mode",e))},getClass:function(e){return e!==this.currentMode?e:"".concat(e," active")}}},x=(n(558),Object(c.a)(C,(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"mode-options"},[n("h4",{staticClass:"title"},[e._v("Choose mode")]),e._v(" "),n("ul",{staticClass:"color-mode-options"},e._l(e.modeOptions,(function(t,o){return n("li",{key:o,class:e.getClass(t.mode),on:{click:function(n){return e.selectMode(t.mode)}}},[e._v(e._s(t.title))])})),0)])}),[],!1,null,null,null).exports),$={name:"UserSettings",directives:{"click-outside":_.a},components:{ModePicker:x,RecoIcon:a.b,ModuleTransition:a.a},data:function(){return{showMenu:!1}},mounted:function(){var e=this.$themeConfig.mode||"auto";!1===this.$themeConfig.modePicker&&("auto"===e&&(window.matchMedia("(prefers-color-scheme: dark)").addListener((function(){O(e)})),window.matchMedia("(prefers-color-scheme: light)").addListener((function(){O(e)}))),O(e))},methods:{hideMenu:function(){this.showMenu=!1}}},j=(n(559),Object(c.a)($,(function(){var e=this,t=e.$createElement,n=e._self._c||t;return!1!==e.$themeConfig.modePicker?n("div",{directives:[{name:"click-outside",rawName:"v-click-outside",value:e.hideMenu,expression:"hideMenu"}],staticClass:"color-picker"},[n("a",{staticClass:"color-button",on:{click:function(t){t.preventDefault(),e.showMenu=!e.showMenu}}},[n("reco-icon",{attrs:{icon:"reco-color"}})],1),e._v(" "),n("ModuleTransition",{attrs:{transform:["translate(-50%, 0)","translate(-50%, -10px)"]}},[n("div",{directives:[{name:"show",rawName:"v-show",value:e.showMenu,expression:"showMenu"}],staticClass:"color-picker-menu"},[n("ModePicker")],1)])],1):e._e()}),[],!1,null,null,null).exports),S=Object(o.b)({components:{SidebarButton:u,NavLinks:b,SearchBox:l,AlgoliaSearchBox:{},Mode:j},setup:function(e,t){var n=Object(i.a)(),r=Object(o.g)(null),a=Object(o.a)((function(){return n.$themeLocaleConfig.algolia||n.$themeConfig.algolia||{}})),s=Object(o.a)((function(){a.value&&a.value.apiKey&&a.value.indexName}));function c(e,t){return e.ownerDocument.defaultView.getComputedStyle(e,null)[t]}return Object(o.d)((function(){var e=parseInt(c(n.$el,"paddingLeft"))+parseInt(c(n.$el,"paddingRight")),t=function(){document.documentElement.clientWidth<719?r.value=null:r.value=n.$el.offsetWidth-e-(n.$refs.siteName&&n.$refs.siteName.offsetWidth||0)};t(),window.addEventListener("resize",t,!1)})),{linksWrapMaxWidth:r,algolia:a,isAlgoliaSearch:s,css:c}}}),L=(n(560),Object(c.a)(S,(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("header",{staticClass:"navbar"},[n("SidebarButton",{on:{"toggle-sidebar":function(t){return e.$emit("toggle-sidebar")}}}),e._v(" "),n("router-link",{staticClass:"home-link",attrs:{to:e.$localePath}},[e.$themeConfig.logo?n("img",{staticClass:"logo",attrs:{src:e.$withBase(e.$themeConfig.logo),alt:e.$siteTitle}}):e._e(),e._v(" "),e.$siteTitle?n("span",{ref:"siteName",staticClass:"site-name"},[e._v(e._s(e.$siteTitle))]):e._e()]),e._v(" "),n("div",{staticClass:"links",style:e.linksWrapMaxWidth?{"max-width":e.linksWrapMaxWidth+"px"}:{}},[n("Mode"),e._v(" "),e.isAlgoliaSearch?n("AlgoliaSearchBox",{attrs:{options:e.algolia}}):!1!==e.$themeConfig.search&&!1!==e.$frontmatter.search?n("SearchBox"):e._e(),e._v(" "),n("NavLinks",{staticClass:"can-hide"})],1)],1)}),[],!1,null,null,null).exports),I=n(542),M=Object(o.b)({name:"Sidebar",components:{SidebarLinks:I.default,NavLinks:b},props:["items"]}),T=(n(563),Object(c.a)(M,(function(){var e=this.$createElement,t=this._self._c||e;return t("aside",{staticClass:"sidebar"},[this._t("top"),this._v(" "),t("NavLinks"),this._v(" "),t("SidebarLinks",{attrs:{depth:0,items:this.items}}),this._v(" "),this._t("bottom")],2)}),[],!1,null,null,null).exports),P=n(543),E=(n(90),n(525)),B=n.n(E),N=Object(o.b)({name:"Password",components:{ModuleTransition:a.a,RecoIcon:a.b},props:{isPage:{type:Boolean,default:!1}},setup:function(e,t){var n=Object(i.a)(),r=(new Date).getFullYear(),a=Object(o.g)(""),s=Object(o.g)("Konck! Knock!"),c=Object(o.a)((function(){var e;return null==n||null===(e=n.$parent)||void 0===e?void 0:e.recoShowModule})),l=Object(o.h)(e).isPage;return{warningText:s,year:r,key:a,recoShowModule:c,inter:function(){var e=B()(a.value.trim()),t="pageKey".concat(window.location.pathname),o=l.value?t:"key";if(sessionStorage.setItem(o,e),l.value?function(){var e=n.$frontmatter.keys.map((function(e){return e.toLowerCase()})),t="pageKey".concat(window.location.pathname);return e&&e.indexOf(sessionStorage.getItem(t))>-1}():n.$themeConfig.keyPage.keys.map((function(e){return e.toLowerCase()})).indexOf(sessionStorage.getItem("key"))>-1){s.value="Key Success";var r=document.getElementById("box").style.width;n.$refs.passwordBtn.style.width="".concat(r-2,"px"),n.$refs.passwordBtn.style.opacity=1,setTimeout((function(){window.location.reload()}),800)}else s.value="Key Error"},inputFocus:function(){s.value="Input Your Key"},inputBlur:function(){s.value="Konck! Knock!"}}}}),A=(n(567),Object(c.a)(N,(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"password-shadow"},[n("ModuleTransition",[n("h3",{directives:[{name:"show",rawName:"v-show",value:e.recoShowModule,expression:"recoShowModule"}],staticClass:"title"},[e._v(e._s(e.isPage?e.$frontmatter.title:e.$site.title||e.$localeConfig.title))])]),e._v(" "),n("ModuleTransition",{attrs:{delay:"0.08"}},[e.recoShowModule&&!e.isPage?n("p",{staticClass:"description"},[e._v(e._s(e.$site.description||e.$localeConfig.description))]):e._e()]),e._v(" "),n("ModuleTransition",{attrs:{delay:"0.16"}},[n("label",{directives:[{name:"show",rawName:"v-show",value:e.recoShowModule,expression:"recoShowModule"}],staticClass:"inputBox",attrs:{id:"box"}},[n("input",{directives:[{name:"model",rawName:"v-model",value:e.key,expression:"key"}],attrs:{type:"password"},domProps:{value:e.key},on:{keyup:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"enter",13,t.key,"Enter")?null:e.inter.apply(null,arguments)},focus:e.inputFocus,blur:e.inputBlur,input:function(t){t.target.composing||(e.key=t.target.value)}}}),e._v(" "),n("span",[e._v(e._s(e.warningText))]),e._v(" "),n("button",{ref:"passwordBtn",on:{click:e.inter}},[e._v("OK")])])]),e._v(" "),n("ModuleTransition",{attrs:{delay:"0.24"}},[n("div",{directives:[{name:"show",rawName:"v-show",value:e.recoShowModule,expression:"recoShowModule"}],staticClass:"footer"},[n("span",[n("reco-icon",{attrs:{icon:"reco-theme"}}),e._v(" "),n("a",{attrs:{target:"blank",href:"https://vuepress-theme-reco.recoluan.com"}},[e._v("vuePress-theme-reco")])],1),e._v(" "),n("span",[n("reco-icon",{attrs:{icon:"reco-copyright"}}),e._v(" "),n("a",[e.$themeConfig.author?n("span",[e._v(e._s(e.$themeConfig.author))]):e._e(),e._v("\n   \n "),e.$themeConfig.startYear&&e.$themeConfig.startYear!=e.year?n("span",[e._v(e._s(e.$themeConfig.startYear)+" - ")]):e._e(),e._v("\n "+e._s(e.year)+"\n ")])],1)])])],1)}),[],!1,null,"25ba6db2",null).exports),H=n(568),R=Object(o.b)({components:{Sidebar:T,Navbar:L,Password:A,PersonalInfo:P.a},props:{sidebar:{type:Boolean,default:!0},sidebarItems:{type:Array,default:function(){return[]}},showModule:{type:Boolean,default:!1}},setup:function(e,t){var n=Object(i.a)(),r=Object(o.g)(!1),a=Object(o.g)(!0),s=Object(o.g)(!0),c=Object(o.g)(!0),l=Object(o.a)((function(){return e.sidebarItems.length>0})),u=Object(o.a)((function(){return n.$themeConfig.keyPage&&!0===n.$themeConfig.keyPage.absoluteEncryption})),f=Object(o.a)((function(){var e=n.$site.themeConfig;return!1!==n.$page.frontmatter.navbar&&!1!==e.navbar&&(n.$title||e.logo||e.repo||e.nav||n.$themeLocaleConfig.nav)})),d=Object(o.a)((function(){var e={"no-navbar":!f.value,"sidebar-open":r.value,"no-sidebar":!l.value},t=(n.$frontmatter||{}).pageClass;return t&&(e[t]=!0),e})),p=function(){var e=n.$themeConfig.keyPage;if(e&&e.keys&&0!==e.keys.length){var t=e.keys;t=t.map((function(e){return e.toLowerCase()})),a.value=t&&t.indexOf(sessionStorage.getItem("key"))>-1}else a.value=!0},h=function(){var e=n.$frontmatter.keys;e&&0!==e.length?(e=e.map((function(e){return e.toLowerCase()})),s.value=e.indexOf(sessionStorage.getItem("pageKey".concat(window.location.pathname)))>-1):s.value=!0},g=Object(o.h)(e).showModule,v=Object(o.a)((function(){return!!c.value||g.value}));return Object(o.d)((function(){var e;n.$router.afterEach((function(){r.value=!1})),p(),h(),e=n.$frontmatter.home&&null==sessionStorage.getItem("firstLoad")?1e3:0,Object(H.setTimeout)((function(){c.value=!1,null==sessionStorage.getItem("firstLoad")&&sessionStorage.setItem("firstLoad",!1)}),e)})),{isSidebarOpen:r,absoluteEncryption:u,shouldShowNavbar:f,shouldShowSidebar:l,pageClasses:d,hasKey:p,hasPageKey:h,isHasKey:a,isHasPageKey:s,toggleSidebar:function(e){r.value="boolean"==typeof e?e:!r.value},firstLoad:c,recoShowModule:v}},watch:{$frontmatter:function(e,t){this.hasKey(),this.hasPageKey()}}}),K=(n(570),Object(c.a)(R,(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"theme-container",class:e.pageClasses},[e.absoluteEncryption?n("div",[n("transition",{attrs:{name:"fade"}},[e.firstLoad?n("LoadingPage"):e.isHasKey?n("div",[e.shouldShowNavbar?n("Navbar",{on:{"toggle-sidebar":e.toggleSidebar}}):e._e(),e._v(" "),n("div",{staticClass:"sidebar-mask",on:{click:function(t){return e.toggleSidebar(!1)}}}),e._v(" "),n("Sidebar",{attrs:{items:e.sidebarItems},on:{"toggle-sidebar":e.toggleSidebar}},[n("PersonalInfo",{attrs:{slot:"top"},slot:"top"}),e._v(" "),e._t("sidebar-bottom",null,{slot:"bottom"})],2),e._v(" "),e.isHasPageKey?e._t("default"):n("Password",{attrs:{isPage:!0}})],2):n("Password")],1)],1):n("div",[n("transition",{attrs:{name:"fade"}},[n("LoadingPage",{directives:[{name:"show",rawName:"v-show",value:e.firstLoad,expression:"firstLoad"}],staticClass:"loading-wrapper"})],1),e._v(" "),n("transition",{attrs:{name:"fade"}},[n("Password",{directives:[{name:"show",rawName:"v-show",value:!e.firstLoad&&!e.isHasKey,expression:"!firstLoad && !isHasKey"}],key:"out",staticClass:"password-wrapper-out"})],1),e._v(" "),n("div",{class:{hide:e.firstLoad||!e.isHasKey}},[e.shouldShowNavbar?n("Navbar",{on:{"toggle-sidebar":e.toggleSidebar}}):e._e(),e._v(" "),n("div",{staticClass:"sidebar-mask",on:{click:function(t){return e.toggleSidebar(!1)}}}),e._v(" "),n("Sidebar",{attrs:{items:e.sidebarItems},on:{"toggle-sidebar":e.toggleSidebar}},[n("PersonalInfo",{attrs:{slot:"top"},slot:"top"}),e._v(" "),e._t("sidebar-bottom",null,{slot:"bottom"})],2),e._v(" "),n("Password",{directives:[{name:"show",rawName:"v-show",value:!e.isHasPageKey,expression:"!isHasPageKey"}],key:"in",staticClass:"password-wrapper-in",attrs:{isPage:!0}}),e._v(" "),n("div",{class:{hide:!e.isHasPageKey}},[e._t("default")],2)],1)],1)])}),[],!1,null,"1aefc0b4",null));t.a=K.exports},509:function(e,t,n){"use strict";var o=n(2),r=n(549);o({target:"String",proto:!0,forced:n(550)("link")},{link:function(e){return r(this,"a","href",e)}})},510:function(e,t,n){"use strict";n(509),n(121),n(8),n(92);var o=n(159),r=n(50),a=n(491),i=n(490),s=Object(o.b)({components:{RecoIcon:a.b},props:{item:{required:!0}},setup:function(e,t){var n=Object(i.a)(),a=Object(o.h)(e).item,s=Object(o.a)((function(){return Object(r.d)(a.value.link)})),c=Object(o.a)((function(){return n.$site.locales?Object.keys(n.$site.locales).some((function(e){return e===s.value})):"/"===s.value}));return{link:s,exact:c,isExternal:r.f,isMailto:r.g,isTel:r.h}}}),c=n(15),l=Object(c.a)(s,(function(){var e=this,t=e.$createElement,n=e._self._c||t;return e.isExternal(e.link)?n("a",{staticClass:"nav-link external",attrs:{href:e.link,target:e.isMailto(e.link)||e.isTel(e.link)?null:"_blank",rel:e.isMailto(e.link)||e.isTel(e.link)?null:"noopener noreferrer"}},[n("reco-icon",{attrs:{icon:""+e.item.icon}}),e._v("\n "+e._s(e.item.text)+"\n "),n("OutboundLink")],1):n("router-link",{staticClass:"nav-link",attrs:{to:e.link,exact:e.exact}},[n("reco-icon",{attrs:{icon:""+e.item.icon}}),e._v("\n "+e._s(e.item.text)+"\n")],1)}),[],!1,null,null,null);t.a=l.exports},512:function(e,t,n){"use strict";var o=n(2),r=n(165).trim;o({target:"String",proto:!0,forced:n(546)("trim")},{trim:function(){return r(this)}})},513:function(e,t,n){},514:function(e,t,n){},515:function(e,t,n){},516:function(e,t,n){},517:function(e,t,n){},518:function(e,t,n){},519:function(e,t,n){},520:function(e,t,n){},521:function(e,t,n){},522:function(e,t,n){},523:function(e,t,n){},524:function(e,t,n){},525:function(e,t,n){var o,r,a,i,s;o=n(565),r=n(526).utf8,a=n(566),i=n(526).bin,(s=function(e,t){e.constructor==String?e=t&&"binary"===t.encoding?i.stringToBytes(e):r.stringToBytes(e):a(e)?e=Array.prototype.slice.call(e,0):Array.isArray(e)||(e=e.toString());for(var n=o.bytesToWords(e),c=8*e.length,l=1732584193,u=-271733879,f=-1732584194,d=271733878,p=0;p>>24)|4278255360&(n[p]<<24|n[p]>>>8);n[c>>>5]|=128<>>9<<4)]=c;var h=s._ff,g=s._gg,v=s._hh,m=s._ii;for(p=0;p>>0,u=u+y>>>0,f=f+_>>>0,d=d+k>>>0}return o.endian([l,u,f,d])})._ff=function(e,t,n,o,r,a,i){var s=e+(t&n|~t&o)+(r>>>0)+i;return(s<>>32-a)+t},s._gg=function(e,t,n,o,r,a,i){var s=e+(t&o|n&~o)+(r>>>0)+i;return(s<>>32-a)+t},s._hh=function(e,t,n,o,r,a,i){var s=e+(t^n^o)+(r>>>0)+i;return(s<>>32-a)+t},s._ii=function(e,t,n,o,r,a,i){var s=e+(n^(t|~o))+(r>>>0)+i;return(s<>>32-a)+t},s._blocksize=16,s._digestsize=16,e.exports=function(e,t){if(null==e)throw new Error("Illegal argument "+e);var n=o.wordsToBytes(s(e,t));return t&&t.asBytes?n:t&&t.asString?i.bytesToString(n):o.bytesToHex(n)}},526:function(e,t){var n={utf8:{stringToBytes:function(e){return n.bin.stringToBytes(unescape(encodeURIComponent(e)))},bytesToString:function(e){return decodeURIComponent(escape(n.bin.bytesToString(e)))}},bin:{stringToBytes:function(e){for(var t=[],n=0;n-1&&(s.value=e)},l=function(){var e=[].slice.call(document.querySelectorAll(".header-anchor")).filter((function(e){return-1!=decodeURIComponent(n.$route.fullPath).indexOf(decodeURIComponent(e.hash))}));null==e||e.length<1||null==e[0].offsetTop||setTimeout((function(){window.scrollTo(0,e[0].offsetTop+160)}),100)},u=function(){var e=document.getElementsByClassName("sidebar")[0],t=document.getElementsByClassName("active sidebar-link")[1];if(null!=t&&null!=t&&null!=t.offsetTop||(t=document.getElementsByClassName("active sidebar-link")[0]),null!=t&&null!=t&&null!=t.offsetTop){var n=e.clientHeight||window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight,o=t.offsetTop,r=t.offsetTop+t.offsetHeight,a=e.scrollTop;r<=n+a||(e.scrollTop=r+5-n),o>=a||(e.scrollTop=o-5)}};return c(),Object(o.d)((function(){!function(){var e=decodeURIComponent(n.$route.fullPath);if(e&&""!=e)for(var t=[].slice.call(document.querySelectorAll(".sidebar-link")),o=0;o"+c+""}},550:function(e,t,n){var o=n(4);e.exports=function(e){return o((function(){var t=""[e]('"');return t!==t.toLowerCase()||t.split('"').length>3}))}},551:function(e,t,n){"use strict";n(513)},552:function(e,t,n){"use strict";n(514)},553:function(e,t,n){"use strict";var o=n(2),r=n(0),a=n(122),i=n(51),s=n(33),c=n(20),l=n(163),u=n(67),f=n(95)("splice"),d=r.TypeError,p=Math.max,h=Math.min;o({target:"Array",proto:!0,forced:!f},{splice:function(e,t){var n,o,r,f,g,v,m=c(this),b=s(m),y=a(e,b),_=arguments.length;if(0===_?n=o=0:1===_?(n=0,o=b-y):(n=_-2,o=h(p(i(t),0),b-y)),b+n-o>9007199254740991)throw d("Maximum allowed length exceeded");for(r=l(m,o),f=0;fb-o+n;f--)delete m[f-1]}else if(n>o)for(f=b-o;f>y;f--)v=f+n-1,(g=f+o-1)in m?m[v]=m[g]:delete m[v];for(f=0;f0&&n.unshift(t.target),e.contains(t.target)||function(e,t){if(!e||!t)return!1;for(var n=0,o=t.length;n>>32-t},rotr:function(e,t){return e<<32-t|e>>>t},endian:function(e){if(e.constructor==Number)return 16711935&o.rotl(e,8)|4278255360&o.rotl(e,24);for(var t=0;t0;e--)t.push(Math.floor(256*Math.random()));return t},bytesToWords:function(e){for(var t=[],n=0,o=0;n>>5]|=e[n]<<24-o%32;return t},wordsToBytes:function(e){for(var t=[],n=0;n<32*e.length;n+=8)t.push(e[n>>>5]>>>24-n%32&255);return t},bytesToHex:function(e){for(var t=[],n=0;n>>4).toString(16)),t.push((15&e[n]).toString(16));return t.join("")},hexToBytes:function(e){for(var t=[],n=0;n>>6*(3-a)&63)):t.push("=");return t.join("")},base64ToBytes:function(e){e=e.replace(/[^A-Z0-9+\/]/gi,"");for(var t=[],o=0,r=0;o>>6-2*r);return t}},e.exports=o},566:function(e,t){function n(e){return!!e.constructor&&"function"==typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)} +/*! + * Determine if an object is a Buffer + * + * @author Feross Aboukhadijeh + * @license MIT + */ +e.exports=function(e){return null!=e&&(n(e)||function(e){return"function"==typeof e.readFloatLE&&"function"==typeof e.slice&&n(e.slice(0,0))}(e)||!!e._isBuffer)}},567:function(e,t,n){"use strict";n(527)},568:function(e,t,n){var o="undefined"!=typeof global&&global||"undefined"!=typeof self&&self||window,r=Function.prototype.apply;function a(e,t){this._id=e,this._clearFn=t}t.setTimeout=function(){return new a(r.call(setTimeout,o,arguments),clearTimeout)},t.setInterval=function(){return new a(r.call(setInterval,o,arguments),clearInterval)},t.clearTimeout=t.clearInterval=function(e){e&&e.close()},a.prototype.unref=a.prototype.ref=function(){},a.prototype.close=function(){this._clearFn.call(o,this._id)},t.enroll=function(e,t){clearTimeout(e._idleTimeoutId),e._idleTimeout=t},t.unenroll=function(e){clearTimeout(e._idleTimeoutId),e._idleTimeout=-1},t._unrefActive=t.active=function(e){clearTimeout(e._idleTimeoutId);var t=e._idleTimeout;t>=0&&(e._idleTimeoutId=setTimeout((function(){e._onTimeout&&e._onTimeout()}),t))},n(569),t.setImmediate="undefined"!=typeof self&&self.setImmediate||"undefined"!=typeof global&&global.setImmediate||this&&this.setImmediate,t.clearImmediate="undefined"!=typeof self&&self.clearImmediate||"undefined"!=typeof global&&global.clearImmediate||this&&this.clearImmediate},569:function(e,t){!function(e,t){"use strict";if(!e.setImmediate){var n,o,r,a,i,s=1,c={},l=!1,u=e.document,f=Object.getPrototypeOf&&Object.getPrototypeOf(e);f=f&&f.setTimeout?f:e,"[object process]"==={}.toString.call(e.process)?n=function(e){process.nextTick((function(){p(e)}))}:!function(){if(e.postMessage&&!e.importScripts){var t=!0,n=e.onmessage;return e.onmessage=function(){t=!1},e.postMessage("","*"),e.onmessage=n,t}}()?e.MessageChannel?((r=new MessageChannel).port1.onmessage=function(e){p(e.data)},n=function(e){r.port2.postMessage(e)}):u&&"onreadystatechange"in u.createElement("script")?(o=u.documentElement,n=function(e){var t=u.createElement("script");t.onreadystatechange=function(){p(e),t.onreadystatechange=null,o.removeChild(t),t=null},o.appendChild(t)}):n=function(e){setTimeout(p,0,e)}:(a="setImmediate$"+Math.random()+"$",i=function(t){t.source===e&&"string"==typeof t.data&&0===t.data.indexOf(a)&&p(+t.data.slice(a.length))},e.addEventListener?e.addEventListener("message",i,!1):e.attachEvent("onmessage",i),n=function(t){e.postMessage(a+t,"*")}),f.setImmediate=function(e){"function"!=typeof e&&(e=new Function(""+e));for(var t=new Array(arguments.length-1),o=0;o")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("include")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("include")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("include")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("include")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("include")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("")])]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("include")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("include")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("include")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("")])]),s._v("\n\n\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("define")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token macro-name"}},[s._v("BUFFER_LENGTH")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token expression"}},[a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1024")])])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("define")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token macro-name"}},[s._v("MAX_EPOLL_EVENTS")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token expression"}},[a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1024")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1024")]),s._v(" ")]),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//connection ")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("define")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token macro-name"}},[s._v("MAX_EPOLL_ITEM")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token expression"}},[a("span",{pre:!0,attrs:{class:"token number"}},[s._v("102400")]),s._v(" ")]),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//con")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("define")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token macro-name"}},[s._v("SERVER_PORT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token expression"}},[a("span",{pre:!0,attrs:{class:"token number"}},[s._v("8888")])])]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("define")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token macro-name"}},[s._v("LISTEN_PORT_COUNT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token expression"}},[a("span",{pre:!0,attrs:{class:"token number"}},[s._v("100")])])]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("typedef")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("NCALLBACK")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ntyevent")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("arg"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("callback"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("arg"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" status"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("char")]),s._v(" buffer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("BUFFER_LENGTH"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" length"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("long")]),s._v(" last_active"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ntyreactor")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" epfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ntyevent")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 1024 * 1024")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("recv_cb")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("arg"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("send_cb")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("arg"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("nty_event_set")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ntyevent")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("ev"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" NCALLBACK callback"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("arg"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("fd "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("callback "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" callback"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("events "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("arg "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" arg"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("last_active "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("time")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n \n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("nty_event_add")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" epfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ntyevent")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("ev"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("epoll_event")]),s._v(" ep_ev "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n ep_ev"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("ptr "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" ev"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n ep_ev"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("events "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("events "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" op"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("status "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n op "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" EPOLL_CTL_MOD"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("else")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n op "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" EPOLL_CTL_ADD"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("status "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("epoll_ctl")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("epfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" op"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("ep_ev"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("printf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"event add failed [fd=%d], events[%d]\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("nty_event_del")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" epfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ntyevent")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("ev"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("epoll_event")]),s._v(" ep_ev "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("status "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n ep_ev"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("ptr "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" ev"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("status "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("epoll_ctl")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("epfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" EPOLL_CTL_DEL"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("ep_ev"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("recv_cb")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("arg"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ntyreactor")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("reactor "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ntyreactor")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("arg"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ntyevent")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("ev "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("events"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v("fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" len "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("recv")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("buffer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" BUFFER_LENGTH"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("nty_event_del")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("epfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" ev"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("len "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n \n ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("length "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" len"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("buffer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("len"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token char"}},[s._v("'\\0'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("printf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"C[%d]:%s\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("buffer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("nty_event_set")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("ev"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" send_cb"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" reactor"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("nty_event_add")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("epfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" EPOLLOUT"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" ev"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n \n \n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("else")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("len "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("close")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("printf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"[fd=%d] pos[%ld], closed\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n \n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("else")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("close")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("printf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"recv[fd=%d] error[%d]:%s\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" errno"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("strerror")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("errno"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n \n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" len"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("send_cb")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("arg"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ntyreactor")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("reactor "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ntyreactor")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("arg"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ntyevent")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("ev "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("events"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v("fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" len "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("send")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("buffer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("length"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("len "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("printf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"send[fd=%d], [%d]%s\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" len"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("buffer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("nty_event_del")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("epfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" ev"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n \n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("nty_event_set")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("ev"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" recv_cb"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" reactor"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("nty_event_add")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("epfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" EPOLLIN"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" ev"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n \n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("else")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("close")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("nty_event_del")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("epfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" ev"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("printf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"send[fd=%d] error %s\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("strerror")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("errno"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" len"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("accept_cb")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("arg"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ntyreactor")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("reactor "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ntyreactor")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("arg"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reactor "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("sockaddr_in")]),s._v(" client_addr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("socklen_t")]),s._v(" len "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("sizeof")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("client_addr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" clientfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("clientfd "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("accept")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("sockaddr")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("client_addr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("len"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("errno "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!=")]),s._v(" EAGAIN "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" errno "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!=")]),s._v(" EINTR"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n \n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("printf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"accept: %s\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("strerror")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("errno"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("do")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token expression"}},[a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")])])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" MAX_EPOLL_EVENTS"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("status "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("break")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" MAX_EPOLL_EVENTS"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("printf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"%s: max connect limit[%d]\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("__func__")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" MAX_EPOLL_EVENTS"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("break")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("endif")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" flag "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("flag "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("fcntl")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("clientfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" F_SETFL"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" O_NONBLOCK"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("printf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"%s: fcntl nonblocking failed, %d\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("__func__")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" MAX_EPOLL_EVENTS"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("break")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("nty_event_set")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("clientfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" clientfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" recv_cb"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" reactor"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("nty_event_add")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("epfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" EPOLLIN"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("clientfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("printf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"new connect [%s:%d][time:%ld], pos[%d]\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" \n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("inet_ntoa")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("client_addr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("sin_addr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("ntohs")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("client_addr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("sin_port"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("last_active"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("init_sock")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("short")]),s._v(" port"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" fd "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("socket")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("AF_INET"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" SOCK_STREAM"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("fcntl")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" F_SETFL"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" O_NONBLOCK"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("sockaddr_in")]),s._v(" server_addr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("memset")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("server_addr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("sizeof")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("server_addr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n server_addr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("sin_family "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" AF_INET"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n server_addr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("sin_addr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("s_addr "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("htonl")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("INADDR_ANY"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n server_addr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("sin_port "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("htons")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("port"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("bind")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("sockaddr")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("server_addr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("sizeof")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("server_addr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("listen")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("20")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("printf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"listen failed : %s\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("strerror")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("errno"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("printf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"listen port : %d\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" port"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("ntyreactor_init")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ntyreactor")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reactor "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("memset")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("sizeof")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ntyreactor")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("epfd "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("epoll_create")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("epfd "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("printf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"create epfd in %s err %s\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("__func__")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("strerror")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("errno"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("events "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ntyevent")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("malloc")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("MAX_EPOLL_EVENTS"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("sizeof")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ntyevent")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("events "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("printf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"create epfd in %s err %s\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("__func__")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("strerror")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("errno"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("close")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("epfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("ntyreactor_destory")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ntyreactor")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("close")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("epfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("free")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("ntyreactor_addlistener")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ntyreactor")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" sockfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" NCALLBACK "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("acceptor"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reactor "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("events "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("nty_event_set")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("sockfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" sockfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" acceptor"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" reactor"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("nty_event_add")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("epfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" EPOLLIN"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("sockfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("ntyreactor_run")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ntyreactor")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reactor "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("epfd "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("events "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("epoll_event")]),s._v(" events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("MAX_EPOLL_ITEM"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" checkpos "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token expression"}},[a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")])])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("long")]),s._v(" now "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("time")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("100")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" checkpos "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("checkpos "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" MAX_EPOLL_EVENTS"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n checkpos "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("checkpos"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("status "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("continue")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("long")]),s._v(" duration "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" now "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("checkpos"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("last_active"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("duration "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("60")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("close")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("checkpos"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("printf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"[fd=%d] timeout\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("checkpos"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("nty_event_del")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("epfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("checkpos"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("endif")])]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 一次能从就绪队列带出数量 event长度 时间")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" nready "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("epoll_wait")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("epfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" MAX_EPOLL_ITEM"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1000")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("nready "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("printf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"epoll_wait error, exit\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("continue")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" nready"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ntyevent")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("ev "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ntyevent")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("ptr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("events "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v(" EPOLLIN"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("events "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v(" EPOLLIN"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("callback")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("arg"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("events "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v(" EPOLLOUT"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("events "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v(" EPOLLOUT"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("callback")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" ev"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("arg"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n \n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("main")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" argc"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("char")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("argv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("unsigned")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("short")]),s._v(" port "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" SERVER_PORT"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("argc "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n port "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("atoi")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("argv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ntyreactor")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("reactor "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ntyreactor")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("malloc")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("sizeof")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ntyreactor")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("ntyreactor_init")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n \n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" listenfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("LISTEN_PORT_COUNT"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" LISTEN_PORT_COUNT"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n listenfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("init_sock")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("port"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v("i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("ntyreactor_addlistener")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" listenfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" accept_cb"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n \n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("ntyreactor_run")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("ntyreactor_destory")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reactor"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" LISTEN_PORT_COUNT"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("close")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("listenfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n \n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br"),a("span",{staticClass:"line-number"},[s._v("20")]),a("br"),a("span",{staticClass:"line-number"},[s._v("21")]),a("br"),a("span",{staticClass:"line-number"},[s._v("22")]),a("br"),a("span",{staticClass:"line-number"},[s._v("23")]),a("br"),a("span",{staticClass:"line-number"},[s._v("24")]),a("br"),a("span",{staticClass:"line-number"},[s._v("25")]),a("br"),a("span",{staticClass:"line-number"},[s._v("26")]),a("br"),a("span",{staticClass:"line-number"},[s._v("27")]),a("br"),a("span",{staticClass:"line-number"},[s._v("28")]),a("br"),a("span",{staticClass:"line-number"},[s._v("29")]),a("br"),a("span",{staticClass:"line-number"},[s._v("30")]),a("br"),a("span",{staticClass:"line-number"},[s._v("31")]),a("br"),a("span",{staticClass:"line-number"},[s._v("32")]),a("br"),a("span",{staticClass:"line-number"},[s._v("33")]),a("br"),a("span",{staticClass:"line-number"},[s._v("34")]),a("br"),a("span",{staticClass:"line-number"},[s._v("35")]),a("br"),a("span",{staticClass:"line-number"},[s._v("36")]),a("br"),a("span",{staticClass:"line-number"},[s._v("37")]),a("br"),a("span",{staticClass:"line-number"},[s._v("38")]),a("br"),a("span",{staticClass:"line-number"},[s._v("39")]),a("br"),a("span",{staticClass:"line-number"},[s._v("40")]),a("br"),a("span",{staticClass:"line-number"},[s._v("41")]),a("br"),a("span",{staticClass:"line-number"},[s._v("42")]),a("br"),a("span",{staticClass:"line-number"},[s._v("43")]),a("br"),a("span",{staticClass:"line-number"},[s._v("44")]),a("br"),a("span",{staticClass:"line-number"},[s._v("45")]),a("br"),a("span",{staticClass:"line-number"},[s._v("46")]),a("br"),a("span",{staticClass:"line-number"},[s._v("47")]),a("br"),a("span",{staticClass:"line-number"},[s._v("48")]),a("br"),a("span",{staticClass:"line-number"},[s._v("49")]),a("br"),a("span",{staticClass:"line-number"},[s._v("50")]),a("br"),a("span",{staticClass:"line-number"},[s._v("51")]),a("br"),a("span",{staticClass:"line-number"},[s._v("52")]),a("br"),a("span",{staticClass:"line-number"},[s._v("53")]),a("br"),a("span",{staticClass:"line-number"},[s._v("54")]),a("br"),a("span",{staticClass:"line-number"},[s._v("55")]),a("br"),a("span",{staticClass:"line-number"},[s._v("56")]),a("br"),a("span",{staticClass:"line-number"},[s._v("57")]),a("br"),a("span",{staticClass:"line-number"},[s._v("58")]),a("br"),a("span",{staticClass:"line-number"},[s._v("59")]),a("br"),a("span",{staticClass:"line-number"},[s._v("60")]),a("br"),a("span",{staticClass:"line-number"},[s._v("61")]),a("br"),a("span",{staticClass:"line-number"},[s._v("62")]),a("br"),a("span",{staticClass:"line-number"},[s._v("63")]),a("br"),a("span",{staticClass:"line-number"},[s._v("64")]),a("br"),a("span",{staticClass:"line-number"},[s._v("65")]),a("br"),a("span",{staticClass:"line-number"},[s._v("66")]),a("br"),a("span",{staticClass:"line-number"},[s._v("67")]),a("br"),a("span",{staticClass:"line-number"},[s._v("68")]),a("br"),a("span",{staticClass:"line-number"},[s._v("69")]),a("br"),a("span",{staticClass:"line-number"},[s._v("70")]),a("br"),a("span",{staticClass:"line-number"},[s._v("71")]),a("br"),a("span",{staticClass:"line-number"},[s._v("72")]),a("br"),a("span",{staticClass:"line-number"},[s._v("73")]),a("br"),a("span",{staticClass:"line-number"},[s._v("74")]),a("br"),a("span",{staticClass:"line-number"},[s._v("75")]),a("br"),a("span",{staticClass:"line-number"},[s._v("76")]),a("br"),a("span",{staticClass:"line-number"},[s._v("77")]),a("br"),a("span",{staticClass:"line-number"},[s._v("78")]),a("br"),a("span",{staticClass:"line-number"},[s._v("79")]),a("br"),a("span",{staticClass:"line-number"},[s._v("80")]),a("br"),a("span",{staticClass:"line-number"},[s._v("81")]),a("br"),a("span",{staticClass:"line-number"},[s._v("82")]),a("br"),a("span",{staticClass:"line-number"},[s._v("83")]),a("br"),a("span",{staticClass:"line-number"},[s._v("84")]),a("br"),a("span",{staticClass:"line-number"},[s._v("85")]),a("br"),a("span",{staticClass:"line-number"},[s._v("86")]),a("br"),a("span",{staticClass:"line-number"},[s._v("87")]),a("br"),a("span",{staticClass:"line-number"},[s._v("88")]),a("br"),a("span",{staticClass:"line-number"},[s._v("89")]),a("br"),a("span",{staticClass:"line-number"},[s._v("90")]),a("br"),a("span",{staticClass:"line-number"},[s._v("91")]),a("br"),a("span",{staticClass:"line-number"},[s._v("92")]),a("br"),a("span",{staticClass:"line-number"},[s._v("93")]),a("br"),a("span",{staticClass:"line-number"},[s._v("94")]),a("br"),a("span",{staticClass:"line-number"},[s._v("95")]),a("br"),a("span",{staticClass:"line-number"},[s._v("96")]),a("br"),a("span",{staticClass:"line-number"},[s._v("97")]),a("br"),a("span",{staticClass:"line-number"},[s._v("98")]),a("br"),a("span",{staticClass:"line-number"},[s._v("99")]),a("br"),a("span",{staticClass:"line-number"},[s._v("100")]),a("br"),a("span",{staticClass:"line-number"},[s._v("101")]),a("br"),a("span",{staticClass:"line-number"},[s._v("102")]),a("br"),a("span",{staticClass:"line-number"},[s._v("103")]),a("br"),a("span",{staticClass:"line-number"},[s._v("104")]),a("br"),a("span",{staticClass:"line-number"},[s._v("105")]),a("br"),a("span",{staticClass:"line-number"},[s._v("106")]),a("br"),a("span",{staticClass:"line-number"},[s._v("107")]),a("br"),a("span",{staticClass:"line-number"},[s._v("108")]),a("br"),a("span",{staticClass:"line-number"},[s._v("109")]),a("br"),a("span",{staticClass:"line-number"},[s._v("110")]),a("br"),a("span",{staticClass:"line-number"},[s._v("111")]),a("br"),a("span",{staticClass:"line-number"},[s._v("112")]),a("br"),a("span",{staticClass:"line-number"},[s._v("113")]),a("br"),a("span",{staticClass:"line-number"},[s._v("114")]),a("br"),a("span",{staticClass:"line-number"},[s._v("115")]),a("br"),a("span",{staticClass:"line-number"},[s._v("116")]),a("br"),a("span",{staticClass:"line-number"},[s._v("117")]),a("br"),a("span",{staticClass:"line-number"},[s._v("118")]),a("br"),a("span",{staticClass:"line-number"},[s._v("119")]),a("br"),a("span",{staticClass:"line-number"},[s._v("120")]),a("br"),a("span",{staticClass:"line-number"},[s._v("121")]),a("br"),a("span",{staticClass:"line-number"},[s._v("122")]),a("br"),a("span",{staticClass:"line-number"},[s._v("123")]),a("br"),a("span",{staticClass:"line-number"},[s._v("124")]),a("br"),a("span",{staticClass:"line-number"},[s._v("125")]),a("br"),a("span",{staticClass:"line-number"},[s._v("126")]),a("br"),a("span",{staticClass:"line-number"},[s._v("127")]),a("br"),a("span",{staticClass:"line-number"},[s._v("128")]),a("br"),a("span",{staticClass:"line-number"},[s._v("129")]),a("br"),a("span",{staticClass:"line-number"},[s._v("130")]),a("br"),a("span",{staticClass:"line-number"},[s._v("131")]),a("br"),a("span",{staticClass:"line-number"},[s._v("132")]),a("br"),a("span",{staticClass:"line-number"},[s._v("133")]),a("br"),a("span",{staticClass:"line-number"},[s._v("134")]),a("br"),a("span",{staticClass:"line-number"},[s._v("135")]),a("br"),a("span",{staticClass:"line-number"},[s._v("136")]),a("br"),a("span",{staticClass:"line-number"},[s._v("137")]),a("br"),a("span",{staticClass:"line-number"},[s._v("138")]),a("br"),a("span",{staticClass:"line-number"},[s._v("139")]),a("br"),a("span",{staticClass:"line-number"},[s._v("140")]),a("br"),a("span",{staticClass:"line-number"},[s._v("141")]),a("br"),a("span",{staticClass:"line-number"},[s._v("142")]),a("br"),a("span",{staticClass:"line-number"},[s._v("143")]),a("br"),a("span",{staticClass:"line-number"},[s._v("144")]),a("br"),a("span",{staticClass:"line-number"},[s._v("145")]),a("br"),a("span",{staticClass:"line-number"},[s._v("146")]),a("br"),a("span",{staticClass:"line-number"},[s._v("147")]),a("br"),a("span",{staticClass:"line-number"},[s._v("148")]),a("br"),a("span",{staticClass:"line-number"},[s._v("149")]),a("br"),a("span",{staticClass:"line-number"},[s._v("150")]),a("br"),a("span",{staticClass:"line-number"},[s._v("151")]),a("br"),a("span",{staticClass:"line-number"},[s._v("152")]),a("br"),a("span",{staticClass:"line-number"},[s._v("153")]),a("br"),a("span",{staticClass:"line-number"},[s._v("154")]),a("br"),a("span",{staticClass:"line-number"},[s._v("155")]),a("br"),a("span",{staticClass:"line-number"},[s._v("156")]),a("br"),a("span",{staticClass:"line-number"},[s._v("157")]),a("br"),a("span",{staticClass:"line-number"},[s._v("158")]),a("br"),a("span",{staticClass:"line-number"},[s._v("159")]),a("br"),a("span",{staticClass:"line-number"},[s._v("160")]),a("br"),a("span",{staticClass:"line-number"},[s._v("161")]),a("br"),a("span",{staticClass:"line-number"},[s._v("162")]),a("br"),a("span",{staticClass:"line-number"},[s._v("163")]),a("br"),a("span",{staticClass:"line-number"},[s._v("164")]),a("br"),a("span",{staticClass:"line-number"},[s._v("165")]),a("br"),a("span",{staticClass:"line-number"},[s._v("166")]),a("br"),a("span",{staticClass:"line-number"},[s._v("167")]),a("br"),a("span",{staticClass:"line-number"},[s._v("168")]),a("br"),a("span",{staticClass:"line-number"},[s._v("169")]),a("br"),a("span",{staticClass:"line-number"},[s._v("170")]),a("br"),a("span",{staticClass:"line-number"},[s._v("171")]),a("br"),a("span",{staticClass:"line-number"},[s._v("172")]),a("br"),a("span",{staticClass:"line-number"},[s._v("173")]),a("br"),a("span",{staticClass:"line-number"},[s._v("174")]),a("br"),a("span",{staticClass:"line-number"},[s._v("175")]),a("br"),a("span",{staticClass:"line-number"},[s._v("176")]),a("br"),a("span",{staticClass:"line-number"},[s._v("177")]),a("br"),a("span",{staticClass:"line-number"},[s._v("178")]),a("br"),a("span",{staticClass:"line-number"},[s._v("179")]),a("br"),a("span",{staticClass:"line-number"},[s._v("180")]),a("br"),a("span",{staticClass:"line-number"},[s._v("181")]),a("br"),a("span",{staticClass:"line-number"},[s._v("182")]),a("br"),a("span",{staticClass:"line-number"},[s._v("183")]),a("br"),a("span",{staticClass:"line-number"},[s._v("184")]),a("br"),a("span",{staticClass:"line-number"},[s._v("185")]),a("br"),a("span",{staticClass:"line-number"},[s._v("186")]),a("br"),a("span",{staticClass:"line-number"},[s._v("187")]),a("br"),a("span",{staticClass:"line-number"},[s._v("188")]),a("br"),a("span",{staticClass:"line-number"},[s._v("189")]),a("br"),a("span",{staticClass:"line-number"},[s._v("190")]),a("br"),a("span",{staticClass:"line-number"},[s._v("191")]),a("br"),a("span",{staticClass:"line-number"},[s._v("192")]),a("br"),a("span",{staticClass:"line-number"},[s._v("193")]),a("br"),a("span",{staticClass:"line-number"},[s._v("194")]),a("br"),a("span",{staticClass:"line-number"},[s._v("195")]),a("br"),a("span",{staticClass:"line-number"},[s._v("196")]),a("br"),a("span",{staticClass:"line-number"},[s._v("197")]),a("br"),a("span",{staticClass:"line-number"},[s._v("198")]),a("br"),a("span",{staticClass:"line-number"},[s._v("199")]),a("br"),a("span",{staticClass:"line-number"},[s._v("200")]),a("br"),a("span",{staticClass:"line-number"},[s._v("201")]),a("br"),a("span",{staticClass:"line-number"},[s._v("202")]),a("br"),a("span",{staticClass:"line-number"},[s._v("203")]),a("br"),a("span",{staticClass:"line-number"},[s._v("204")]),a("br"),a("span",{staticClass:"line-number"},[s._v("205")]),a("br"),a("span",{staticClass:"line-number"},[s._v("206")]),a("br"),a("span",{staticClass:"line-number"},[s._v("207")]),a("br"),a("span",{staticClass:"line-number"},[s._v("208")]),a("br"),a("span",{staticClass:"line-number"},[s._v("209")]),a("br"),a("span",{staticClass:"line-number"},[s._v("210")]),a("br"),a("span",{staticClass:"line-number"},[s._v("211")]),a("br"),a("span",{staticClass:"line-number"},[s._v("212")]),a("br"),a("span",{staticClass:"line-number"},[s._v("213")]),a("br"),a("span",{staticClass:"line-number"},[s._v("214")]),a("br"),a("span",{staticClass:"line-number"},[s._v("215")]),a("br"),a("span",{staticClass:"line-number"},[s._v("216")]),a("br"),a("span",{staticClass:"line-number"},[s._v("217")]),a("br"),a("span",{staticClass:"line-number"},[s._v("218")]),a("br"),a("span",{staticClass:"line-number"},[s._v("219")]),a("br"),a("span",{staticClass:"line-number"},[s._v("220")]),a("br"),a("span",{staticClass:"line-number"},[s._v("221")]),a("br"),a("span",{staticClass:"line-number"},[s._v("222")]),a("br"),a("span",{staticClass:"line-number"},[s._v("223")]),a("br"),a("span",{staticClass:"line-number"},[s._v("224")]),a("br"),a("span",{staticClass:"line-number"},[s._v("225")]),a("br"),a("span",{staticClass:"line-number"},[s._v("226")]),a("br"),a("span",{staticClass:"line-number"},[s._v("227")]),a("br"),a("span",{staticClass:"line-number"},[s._v("228")]),a("br"),a("span",{staticClass:"line-number"},[s._v("229")]),a("br"),a("span",{staticClass:"line-number"},[s._v("230")]),a("br"),a("span",{staticClass:"line-number"},[s._v("231")]),a("br"),a("span",{staticClass:"line-number"},[s._v("232")]),a("br"),a("span",{staticClass:"line-number"},[s._v("233")]),a("br"),a("span",{staticClass:"line-number"},[s._v("234")]),a("br"),a("span",{staticClass:"line-number"},[s._v("235")]),a("br"),a("span",{staticClass:"line-number"},[s._v("236")]),a("br"),a("span",{staticClass:"line-number"},[s._v("237")]),a("br"),a("span",{staticClass:"line-number"},[s._v("238")]),a("br"),a("span",{staticClass:"line-number"},[s._v("239")]),a("br"),a("span",{staticClass:"line-number"},[s._v("240")]),a("br"),a("span",{staticClass:"line-number"},[s._v("241")]),a("br"),a("span",{staticClass:"line-number"},[s._v("242")]),a("br"),a("span",{staticClass:"line-number"},[s._v("243")]),a("br"),a("span",{staticClass:"line-number"},[s._v("244")]),a("br"),a("span",{staticClass:"line-number"},[s._v("245")]),a("br"),a("span",{staticClass:"line-number"},[s._v("246")]),a("br"),a("span",{staticClass:"line-number"},[s._v("247")]),a("br"),a("span",{staticClass:"line-number"},[s._v("248")]),a("br"),a("span",{staticClass:"line-number"},[s._v("249")]),a("br"),a("span",{staticClass:"line-number"},[s._v("250")]),a("br"),a("span",{staticClass:"line-number"},[s._v("251")]),a("br"),a("span",{staticClass:"line-number"},[s._v("252")]),a("br"),a("span",{staticClass:"line-number"},[s._v("253")]),a("br"),a("span",{staticClass:"line-number"},[s._v("254")]),a("br"),a("span",{staticClass:"line-number"},[s._v("255")]),a("br"),a("span",{staticClass:"line-number"},[s._v("256")]),a("br"),a("span",{staticClass:"line-number"},[s._v("257")]),a("br"),a("span",{staticClass:"line-number"},[s._v("258")]),a("br"),a("span",{staticClass:"line-number"},[s._v("259")]),a("br"),a("span",{staticClass:"line-number"},[s._v("260")]),a("br"),a("span",{staticClass:"line-number"},[s._v("261")]),a("br"),a("span",{staticClass:"line-number"},[s._v("262")]),a("br"),a("span",{staticClass:"line-number"},[s._v("263")]),a("br"),a("span",{staticClass:"line-number"},[s._v("264")]),a("br"),a("span",{staticClass:"line-number"},[s._v("265")]),a("br"),a("span",{staticClass:"line-number"},[s._v("266")]),a("br"),a("span",{staticClass:"line-number"},[s._v("267")]),a("br"),a("span",{staticClass:"line-number"},[s._v("268")]),a("br"),a("span",{staticClass:"line-number"},[s._v("269")]),a("br"),a("span",{staticClass:"line-number"},[s._v("270")]),a("br"),a("span",{staticClass:"line-number"},[s._v("271")]),a("br"),a("span",{staticClass:"line-number"},[s._v("272")]),a("br"),a("span",{staticClass:"line-number"},[s._v("273")]),a("br"),a("span",{staticClass:"line-number"},[s._v("274")]),a("br"),a("span",{staticClass:"line-number"},[s._v("275")]),a("br"),a("span",{staticClass:"line-number"},[s._v("276")]),a("br"),a("span",{staticClass:"line-number"},[s._v("277")]),a("br"),a("span",{staticClass:"line-number"},[s._v("278")]),a("br"),a("span",{staticClass:"line-number"},[s._v("279")]),a("br"),a("span",{staticClass:"line-number"},[s._v("280")]),a("br"),a("span",{staticClass:"line-number"},[s._v("281")]),a("br"),a("span",{staticClass:"line-number"},[s._v("282")]),a("br"),a("span",{staticClass:"line-number"},[s._v("283")]),a("br"),a("span",{staticClass:"line-number"},[s._v("284")]),a("br"),a("span",{staticClass:"line-number"},[s._v("285")]),a("br"),a("span",{staticClass:"line-number"},[s._v("286")]),a("br"),a("span",{staticClass:"line-number"},[s._v("287")]),a("br"),a("span",{staticClass:"line-number"},[s._v("288")]),a("br"),a("span",{staticClass:"line-number"},[s._v("289")]),a("br"),a("span",{staticClass:"line-number"},[s._v("290")]),a("br"),a("span",{staticClass:"line-number"},[s._v("291")]),a("br"),a("span",{staticClass:"line-number"},[s._v("292")]),a("br"),a("span",{staticClass:"line-number"},[s._v("293")]),a("br"),a("span",{staticClass:"line-number"},[s._v("294")]),a("br"),a("span",{staticClass:"line-number"},[s._v("295")]),a("br"),a("span",{staticClass:"line-number"},[s._v("296")]),a("br"),a("span",{staticClass:"line-number"},[s._v("297")]),a("br"),a("span",{staticClass:"line-number"},[s._v("298")]),a("br"),a("span",{staticClass:"line-number"},[s._v("299")]),a("br"),a("span",{staticClass:"line-number"},[s._v("300")]),a("br"),a("span",{staticClass:"line-number"},[s._v("301")]),a("br"),a("span",{staticClass:"line-number"},[s._v("302")]),a("br"),a("span",{staticClass:"line-number"},[s._v("303")]),a("br"),a("span",{staticClass:"line-number"},[s._v("304")]),a("br"),a("span",{staticClass:"line-number"},[s._v("305")]),a("br"),a("span",{staticClass:"line-number"},[s._v("306")]),a("br"),a("span",{staticClass:"line-number"},[s._v("307")]),a("br"),a("span",{staticClass:"line-number"},[s._v("308")]),a("br"),a("span",{staticClass:"line-number"},[s._v("309")]),a("br"),a("span",{staticClass:"line-number"},[s._v("310")]),a("br"),a("span",{staticClass:"line-number"},[s._v("311")]),a("br"),a("span",{staticClass:"line-number"},[s._v("312")]),a("br"),a("span",{staticClass:"line-number"},[s._v("313")]),a("br"),a("span",{staticClass:"line-number"},[s._v("314")]),a("br"),a("span",{staticClass:"line-number"},[s._v("315")]),a("br"),a("span",{staticClass:"line-number"},[s._v("316")]),a("br"),a("span",{staticClass:"line-number"},[s._v("317")]),a("br"),a("span",{staticClass:"line-number"},[s._v("318")]),a("br"),a("span",{staticClass:"line-number"},[s._v("319")]),a("br"),a("span",{staticClass:"line-number"},[s._v("320")]),a("br"),a("span",{staticClass:"line-number"},[s._v("321")]),a("br"),a("span",{staticClass:"line-number"},[s._v("322")]),a("br"),a("span",{staticClass:"line-number"},[s._v("323")]),a("br"),a("span",{staticClass:"line-number"},[s._v("324")]),a("br"),a("span",{staticClass:"line-number"},[s._v("325")]),a("br"),a("span",{staticClass:"line-number"},[s._v("326")]),a("br"),a("span",{staticClass:"line-number"},[s._v("327")]),a("br"),a("span",{staticClass:"line-number"},[s._v("328")]),a("br"),a("span",{staticClass:"line-number"},[s._v("329")]),a("br"),a("span",{staticClass:"line-number"},[s._v("330")]),a("br"),a("span",{staticClass:"line-number"},[s._v("331")]),a("br"),a("span",{staticClass:"line-number"},[s._v("332")]),a("br"),a("span",{staticClass:"line-number"},[s._v("333")]),a("br"),a("span",{staticClass:"line-number"},[s._v("334")]),a("br"),a("span",{staticClass:"line-number"},[s._v("335")]),a("br"),a("span",{staticClass:"line-number"},[s._v("336")]),a("br"),a("span",{staticClass:"line-number"},[s._v("337")]),a("br"),a("span",{staticClass:"line-number"},[s._v("338")]),a("br"),a("span",{staticClass:"line-number"},[s._v("339")]),a("br"),a("span",{staticClass:"line-number"},[s._v("340")]),a("br"),a("span",{staticClass:"line-number"},[s._v("341")]),a("br"),a("span",{staticClass:"line-number"},[s._v("342")]),a("br"),a("span",{staticClass:"line-number"},[s._v("343")]),a("br"),a("span",{staticClass:"line-number"},[s._v("344")]),a("br"),a("span",{staticClass:"line-number"},[s._v("345")]),a("br"),a("span",{staticClass:"line-number"},[s._v("346")]),a("br"),a("span",{staticClass:"line-number"},[s._v("347")]),a("br"),a("span",{staticClass:"line-number"},[s._v("348")]),a("br"),a("span",{staticClass:"line-number"},[s._v("349")]),a("br"),a("span",{staticClass:"line-number"},[s._v("350")]),a("br"),a("span",{staticClass:"line-number"},[s._v("351")]),a("br"),a("span",{staticClass:"line-number"},[s._v("352")]),a("br")])]),a("p",[s._v("mul_port_client_epoll.c")]),s._v(" "),a("div",{staticClass:"language-c line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-c"}},[a("code",[s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("include")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("include")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("include")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("")])]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("include")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("include")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("include")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("include")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("include")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("include")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("include")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("include")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("")])]),s._v("\n\n\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("define")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token macro-name"}},[s._v("MAX_BUFFER")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token expression"}},[a("span",{pre:!0,attrs:{class:"token number"}},[s._v("128")])])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("define")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token macro-name"}},[s._v("MAX_EPOLLSIZE")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token expression"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("384")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1024")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")])])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("define")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token macro-name"}},[s._v("MAX_PORT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token expression"}},[a("span",{pre:!0,attrs:{class:"token number"}},[s._v("100")])])]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("define")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token macro-name function"}},[s._v("TIME_SUB_MS")]),a("span",{pre:!0,attrs:{class:"token expression"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("tv1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" tv2"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("tv1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("tv_sec "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" tv2"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("tv_sec"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1000")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("tv1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("tv_usec "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" tv2"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("tv_usec"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1000")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")])])]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" isContinue "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("static")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("ntySetNonblock")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" flags"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n flags "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("fcntl")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" F_GETFL"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("flags "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" flags"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n flags "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|=")]),s._v(" O_NONBLOCK"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("fcntl")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" F_SETFL"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" flags"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("static")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("ntySetReUseAddr")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" reuse "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("setsockopt")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" SOL_SOCKET"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" SO_REUSEADDR"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("char")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("reuse"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("sizeof")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reuse"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("main")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" argc"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("char")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("argv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("argc "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("printf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"Usage: %s ip port\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" argv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("exit")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("const")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("char")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("ip "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" argv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" port "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("atoi")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("argv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" connections "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("char")]),s._v(" buffer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("128")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" index "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("epoll_event")]),s._v(" events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("MAX_EPOLLSIZE"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" epoll_fd "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("epoll_create")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("MAX_EPOLLSIZE"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n \n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("strcpy")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("buffer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('" Data From MulClient\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("sockaddr_in")]),s._v(" addr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("memset")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("addr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("sizeof")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("sockaddr_in")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n \n addr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("sin_family "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" AF_INET"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n addr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("sin_addr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("s_addr "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("inet_addr")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("ip"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("timeval")]),s._v(" tv_begin"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("gettimeofday")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("tv_begin"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),s._v("index "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">=")]),s._v(" MAX_PORT"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" index "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n \n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("epoll_event")]),s._v(" ev"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" sockfd "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("connections "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("500000")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!")]),s._v("isContinue"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n sockfd "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("socket")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("AF_INET"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" SOCK_STREAM"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("sockfd "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("perror")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"socket"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("goto")]),s._v(" err"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//ntySetReUseAddr(sockfd);")]),s._v("\n addr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("sin_port "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("htons")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("port"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),s._v("index"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("connect")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("sockfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("sockaddr")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("addr"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("sizeof")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("sockaddr_in")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("perror")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"connect"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("goto")]),s._v(" err"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("ntySetNonblock")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("sockfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("ntySetReUseAddr")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("sockfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("sprintf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("buffer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"Hello Server: client --\x3e %d\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" connections"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("send")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("sockfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" buffer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("strlen")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("buffer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n ev"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("fd "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" sockfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n ev"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("events "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" EPOLLIN "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" EPOLLOUT"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("epoll_ctl")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("epoll_fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" EPOLL_CTL_ADD"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" sockfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("ev"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n \n connections "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//connections ++;")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("connections "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("%")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1000")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("999")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("||")]),s._v(" connections "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("340000")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("timeval")]),s._v(" tv_cur"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("memcpy")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("tv_cur"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("tv_begin"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("sizeof")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("timeval")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n \n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("gettimeofday")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("tv_begin"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" time_used "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("TIME_SUB_MS")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("tv_begin"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" tv_cur"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("printf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"connections: %d, sockfd:%d, time_used:%d\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" connections"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" sockfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" time_used"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" nfds "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("epoll_wait")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("epoll_fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" connections"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("100")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" nfds"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" clientfd "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("fd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("events "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v(" EPOLLOUT"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("sprintf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("buffer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"data from %d\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" clientfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("send")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("sockfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" buffer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("strlen")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("buffer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("else")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("events"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("events "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v(" EPOLLIN"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("char")]),s._v(" rBuffer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("MAX_BUFFER"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ssize_t")]),s._v(" length "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("recv")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("sockfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" rBuffer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" MAX_BUFFER"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("length "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("printf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('" RecvBuffer:%s\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" rBuffer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("strcmp")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("rBuffer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"quit"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n isContinue "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n \n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("else")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("length "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("printf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('" Disconnect clientfd:%d\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" clientfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n connections "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("close")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("clientfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("else")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("errno "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" EINTR"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("continue")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("printf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('" Error clientfd:%d, errno:%d\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" clientfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" errno"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("close")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("clientfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("else")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("printf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('" clientfd:%d, errno:%d\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" clientfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" errno"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("close")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("clientfd"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("usleep")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1000")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\nerr"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("printf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"error : %s\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("strerror")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("errno"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n \n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br"),a("span",{staticClass:"line-number"},[s._v("20")]),a("br"),a("span",{staticClass:"line-number"},[s._v("21")]),a("br"),a("span",{staticClass:"line-number"},[s._v("22")]),a("br"),a("span",{staticClass:"line-number"},[s._v("23")]),a("br"),a("span",{staticClass:"line-number"},[s._v("24")]),a("br"),a("span",{staticClass:"line-number"},[s._v("25")]),a("br"),a("span",{staticClass:"line-number"},[s._v("26")]),a("br"),a("span",{staticClass:"line-number"},[s._v("27")]),a("br"),a("span",{staticClass:"line-number"},[s._v("28")]),a("br"),a("span",{staticClass:"line-number"},[s._v("29")]),a("br"),a("span",{staticClass:"line-number"},[s._v("30")]),a("br"),a("span",{staticClass:"line-number"},[s._v("31")]),a("br"),a("span",{staticClass:"line-number"},[s._v("32")]),a("br"),a("span",{staticClass:"line-number"},[s._v("33")]),a("br"),a("span",{staticClass:"line-number"},[s._v("34")]),a("br"),a("span",{staticClass:"line-number"},[s._v("35")]),a("br"),a("span",{staticClass:"line-number"},[s._v("36")]),a("br"),a("span",{staticClass:"line-number"},[s._v("37")]),a("br"),a("span",{staticClass:"line-number"},[s._v("38")]),a("br"),a("span",{staticClass:"line-number"},[s._v("39")]),a("br"),a("span",{staticClass:"line-number"},[s._v("40")]),a("br"),a("span",{staticClass:"line-number"},[s._v("41")]),a("br"),a("span",{staticClass:"line-number"},[s._v("42")]),a("br"),a("span",{staticClass:"line-number"},[s._v("43")]),a("br"),a("span",{staticClass:"line-number"},[s._v("44")]),a("br"),a("span",{staticClass:"line-number"},[s._v("45")]),a("br"),a("span",{staticClass:"line-number"},[s._v("46")]),a("br"),a("span",{staticClass:"line-number"},[s._v("47")]),a("br"),a("span",{staticClass:"line-number"},[s._v("48")]),a("br"),a("span",{staticClass:"line-number"},[s._v("49")]),a("br"),a("span",{staticClass:"line-number"},[s._v("50")]),a("br"),a("span",{staticClass:"line-number"},[s._v("51")]),a("br"),a("span",{staticClass:"line-number"},[s._v("52")]),a("br"),a("span",{staticClass:"line-number"},[s._v("53")]),a("br"),a("span",{staticClass:"line-number"},[s._v("54")]),a("br"),a("span",{staticClass:"line-number"},[s._v("55")]),a("br"),a("span",{staticClass:"line-number"},[s._v("56")]),a("br"),a("span",{staticClass:"line-number"},[s._v("57")]),a("br"),a("span",{staticClass:"line-number"},[s._v("58")]),a("br"),a("span",{staticClass:"line-number"},[s._v("59")]),a("br"),a("span",{staticClass:"line-number"},[s._v("60")]),a("br"),a("span",{staticClass:"line-number"},[s._v("61")]),a("br"),a("span",{staticClass:"line-number"},[s._v("62")]),a("br"),a("span",{staticClass:"line-number"},[s._v("63")]),a("br"),a("span",{staticClass:"line-number"},[s._v("64")]),a("br"),a("span",{staticClass:"line-number"},[s._v("65")]),a("br"),a("span",{staticClass:"line-number"},[s._v("66")]),a("br"),a("span",{staticClass:"line-number"},[s._v("67")]),a("br"),a("span",{staticClass:"line-number"},[s._v("68")]),a("br"),a("span",{staticClass:"line-number"},[s._v("69")]),a("br"),a("span",{staticClass:"line-number"},[s._v("70")]),a("br"),a("span",{staticClass:"line-number"},[s._v("71")]),a("br"),a("span",{staticClass:"line-number"},[s._v("72")]),a("br"),a("span",{staticClass:"line-number"},[s._v("73")]),a("br"),a("span",{staticClass:"line-number"},[s._v("74")]),a("br"),a("span",{staticClass:"line-number"},[s._v("75")]),a("br"),a("span",{staticClass:"line-number"},[s._v("76")]),a("br"),a("span",{staticClass:"line-number"},[s._v("77")]),a("br"),a("span",{staticClass:"line-number"},[s._v("78")]),a("br"),a("span",{staticClass:"line-number"},[s._v("79")]),a("br"),a("span",{staticClass:"line-number"},[s._v("80")]),a("br"),a("span",{staticClass:"line-number"},[s._v("81")]),a("br"),a("span",{staticClass:"line-number"},[s._v("82")]),a("br"),a("span",{staticClass:"line-number"},[s._v("83")]),a("br"),a("span",{staticClass:"line-number"},[s._v("84")]),a("br"),a("span",{staticClass:"line-number"},[s._v("85")]),a("br"),a("span",{staticClass:"line-number"},[s._v("86")]),a("br"),a("span",{staticClass:"line-number"},[s._v("87")]),a("br"),a("span",{staticClass:"line-number"},[s._v("88")]),a("br"),a("span",{staticClass:"line-number"},[s._v("89")]),a("br"),a("span",{staticClass:"line-number"},[s._v("90")]),a("br"),a("span",{staticClass:"line-number"},[s._v("91")]),a("br"),a("span",{staticClass:"line-number"},[s._v("92")]),a("br"),a("span",{staticClass:"line-number"},[s._v("93")]),a("br"),a("span",{staticClass:"line-number"},[s._v("94")]),a("br"),a("span",{staticClass:"line-number"},[s._v("95")]),a("br"),a("span",{staticClass:"line-number"},[s._v("96")]),a("br"),a("span",{staticClass:"line-number"},[s._v("97")]),a("br"),a("span",{staticClass:"line-number"},[s._v("98")]),a("br"),a("span",{staticClass:"line-number"},[s._v("99")]),a("br"),a("span",{staticClass:"line-number"},[s._v("100")]),a("br"),a("span",{staticClass:"line-number"},[s._v("101")]),a("br"),a("span",{staticClass:"line-number"},[s._v("102")]),a("br"),a("span",{staticClass:"line-number"},[s._v("103")]),a("br"),a("span",{staticClass:"line-number"},[s._v("104")]),a("br"),a("span",{staticClass:"line-number"},[s._v("105")]),a("br"),a("span",{staticClass:"line-number"},[s._v("106")]),a("br"),a("span",{staticClass:"line-number"},[s._v("107")]),a("br"),a("span",{staticClass:"line-number"},[s._v("108")]),a("br"),a("span",{staticClass:"line-number"},[s._v("109")]),a("br"),a("span",{staticClass:"line-number"},[s._v("110")]),a("br"),a("span",{staticClass:"line-number"},[s._v("111")]),a("br"),a("span",{staticClass:"line-number"},[s._v("112")]),a("br"),a("span",{staticClass:"line-number"},[s._v("113")]),a("br"),a("span",{staticClass:"line-number"},[s._v("114")]),a("br"),a("span",{staticClass:"line-number"},[s._v("115")]),a("br"),a("span",{staticClass:"line-number"},[s._v("116")]),a("br"),a("span",{staticClass:"line-number"},[s._v("117")]),a("br"),a("span",{staticClass:"line-number"},[s._v("118")]),a("br"),a("span",{staticClass:"line-number"},[s._v("119")]),a("br"),a("span",{staticClass:"line-number"},[s._v("120")]),a("br"),a("span",{staticClass:"line-number"},[s._v("121")]),a("br"),a("span",{staticClass:"line-number"},[s._v("122")]),a("br"),a("span",{staticClass:"line-number"},[s._v("123")]),a("br"),a("span",{staticClass:"line-number"},[s._v("124")]),a("br"),a("span",{staticClass:"line-number"},[s._v("125")]),a("br"),a("span",{staticClass:"line-number"},[s._v("126")]),a("br"),a("span",{staticClass:"line-number"},[s._v("127")]),a("br"),a("span",{staticClass:"line-number"},[s._v("128")]),a("br"),a("span",{staticClass:"line-number"},[s._v("129")]),a("br"),a("span",{staticClass:"line-number"},[s._v("130")]),a("br"),a("span",{staticClass:"line-number"},[s._v("131")]),a("br"),a("span",{staticClass:"line-number"},[s._v("132")]),a("br"),a("span",{staticClass:"line-number"},[s._v("133")]),a("br"),a("span",{staticClass:"line-number"},[s._v("134")]),a("br"),a("span",{staticClass:"line-number"},[s._v("135")]),a("br"),a("span",{staticClass:"line-number"},[s._v("136")]),a("br"),a("span",{staticClass:"line-number"},[s._v("137")]),a("br"),a("span",{staticClass:"line-number"},[s._v("138")]),a("br"),a("span",{staticClass:"line-number"},[s._v("139")]),a("br"),a("span",{staticClass:"line-number"},[s._v("140")]),a("br"),a("span",{staticClass:"line-number"},[s._v("141")]),a("br"),a("span",{staticClass:"line-number"},[s._v("142")]),a("br"),a("span",{staticClass:"line-number"},[s._v("143")]),a("br"),a("span",{staticClass:"line-number"},[s._v("144")]),a("br"),a("span",{staticClass:"line-number"},[s._v("145")]),a("br"),a("span",{staticClass:"line-number"},[s._v("146")]),a("br"),a("span",{staticClass:"line-number"},[s._v("147")]),a("br"),a("span",{staticClass:"line-number"},[s._v("148")]),a("br"),a("span",{staticClass:"line-number"},[s._v("149")]),a("br"),a("span",{staticClass:"line-number"},[s._v("150")]),a("br"),a("span",{staticClass:"line-number"},[s._v("151")]),a("br"),a("span",{staticClass:"line-number"},[s._v("152")]),a("br"),a("span",{staticClass:"line-number"},[s._v("153")]),a("br"),a("span",{staticClass:"line-number"},[s._v("154")]),a("br")])])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/13.d8a01b18.js b/assets/js/13.d8a01b18.js new file mode 100644 index 0000000..c752770 --- /dev/null +++ b/assets/js/13.d8a01b18.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[13],{595:function(t,s,n){"use strict";n.r(s);var a=n(15),e=Object(a.a)({},(function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("p",[n("strong",[t._v("GDB调试手册")])]),t._v(" "),n("p",[n("strong",[t._v("目录")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#0-%E7%94%A8gdb%E8%B0%83%E8%AF%95%E7%A8%8B%E5%BA%8F"}},[t._v("0 用GDB调试程序")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#01gdb%E6%A6%82%E8%BF%B0"}},[t._v("0.1 GDB概述")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#02-%E8%B0%83%E8%AF%95%E7%A4%BA%E4%BE%8B"}},[t._v("0.2 调试示例")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#021-%E6%BA%90%E4%BB%A3%E7%A0%81test1c"}},[t._v("0.2.1 源代码test1.c")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#022-%E8%B0%83%E8%AF%95%E8%BF%87%E7%A8%8B"}},[t._v("0.2.2 调试过程")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#03-%E4%BD%BF%E7%94%A8gdb"}},[t._v("0.3 使用GDB")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#031-%E5%90%AF%E5%8A%A8gdb"}},[t._v("0.3.1 启动GDB")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#032gdb%E7%8E%AF%E5%A2%83%E4%B8%AD%E4%BD%BF%E7%94%A8shell%E5%91%BD%E4%BB%A4"}},[t._v("0.3.2 GDB环境中使用shell命令")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#033-%E5%9C%A8gdb%E4%B8%AD%E8%BF%90%E8%A1%8C%E7%A8%8B%E5%BA%8F"}},[t._v("0.3.3 在GDB中运行程序")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#1-%E8%AE%BE%E7%BD%AE%E6%96%AD%E7%82%B9"}},[t._v("1 设置断点")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#11-%E4%BD%BF%E7%94%A8%E5%91%BD%E4%BB%A4"}},[t._v("1.1 使用命令")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#12-%E7%A4%BA%E4%BE%8B"}},[t._v("1.2 示例")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#121-%E8%B0%83%E8%AF%95%E8%BF%87%E7%A8%8B"}},[t._v("1.2.1 调试过程")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#2-%E7%A8%8B%E5%BA%8F%E7%9A%84%E5%8D%95%E6%AD%A5%E6%89%A7%E8%A1%8C"}},[t._v("2 程序的单步执行")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#21-%E4%BD%BF%E7%94%A8%E5%91%BD%E4%BB%A4"}},[t._v("2.1 使用命令")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#22-%E7%A4%BA%E4%BE%8B"}},[t._v("2.2 示例")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#221-%E8%B0%83%E8%AF%95%E8%BF%87%E7%A8%8B"}},[t._v("2.2.1 调试过程")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#3-%E6%98%BE%E7%A4%BA%E4%BF%AE%E6%94%B9%E5%8F%98%E9%87%8F%E7%9A%84%E5%80%BC"}},[t._v("3 显示/修改变量的值")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#31%E4%BD%BF%E7%94%A8%E5%91%BD%E4%BB%A4"}},[t._v("3.1使用命令")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#32%E7%A4%BA%E4%BE%8B"}},[t._v("3.2示例")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#321-%E6%BA%90%E4%BB%A3%E7%A0%81test2c"}},[t._v("3.2.1 源代码test2.c")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#322-%E8%B0%83%E8%AF%95%E8%BF%87%E7%A8%8B"}},[t._v("3.2.2 调试过程")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#4-%E7%9B%91%E8%A7%86%E7%A8%8B%E5%BA%8F%E5%8F%98%E9%87%8F%E5%80%BC"}},[t._v("4 监视程序变量值")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#41-%E4%BD%BF%E7%94%A8%E5%91%BD%E4%BB%A4"}},[t._v("4.1 使用命令")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#42-%E7%A4%BA%E4%BE%8B"}},[t._v("4.2 示例")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#421-%E8%B0%83%E8%AF%95%E8%BF%87%E7%A8%8B"}},[t._v("4.2.1 调试过程")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#5-%E6%98%BE%E7%A4%BA%E4%BF%AE%E6%94%B9%E5%AF%84%E5%AD%98%E5%99%A8"}},[t._v("5 显示/修改寄存器")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#51-%E8%83%8C%E6%99%AF%E7%9F%A5%E8%AF%86"}},[t._v("5.1 背景知识")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#52-%E4%BD%BF%E7%94%A8%E5%91%BD%E4%BB%A4"}},[t._v("5.2 使用命令")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#53-%E7%A4%BA%E4%BE%8B"}},[t._v("5.3 示例")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#521-%E8%B0%83%E8%AF%95%E8%BF%87%E7%A8%8B"}},[t._v("5.2.1 调试过程")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#6-%E6%9F%A5%E7%9C%8B%E7%A8%8B%E5%BA%8F%E7%9A%84%E5%A0%86%E6%A0%88"}},[t._v("6 查看程序的堆栈")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#61-%E8%83%8C%E6%99%AF%E7%9F%A5%E8%AF%86"}},[t._v("6.1 背景知识")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#62-%E4%BD%BF%E7%94%A8%E5%91%BD%E4%BB%A4"}},[t._v("6.2 使用命令")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#63-%E7%A4%BA%E4%BE%8B"}},[t._v("6.3 示例")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#631-%E6%BA%90%E4%BB%A3%E7%A0%81test3c"}},[t._v("6.3.1 源代码test3.c")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#632-%E8%B0%83%E8%AF%95%E8%BF%87%E7%A8%8B"}},[t._v("6.3.2 调试过程")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#7-%E5%A4%9A%E7%BA%BF%E7%A8%8B%E8%B0%83%E8%AF%95"}},[t._v("7 多线程调试")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#71-%E4%BD%BF%E7%94%A8%E5%91%BD%E4%BB%A4"}},[t._v("7.1 使用命令")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#72-%E7%A4%BA%E4%BE%8B"}},[t._v("7.2 示例")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#721-%E6%BA%90%E4%BB%A3%E7%A0%81test4c"}},[t._v("7.2.1 源代码test4.c")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#722-%E8%B0%83%E8%AF%95%E8%BF%87%E7%A8%8B"}},[t._v("7.2.2 调试过程")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#8-%E6%AD%BB%E9%94%81%E8%B0%83%E8%AF%95"}},[t._v("8 死锁调试")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#81-%E4%BD%BF%E7%94%A8%E5%91%BD%E4%BB%A4"}},[t._v("8.1 使用命令")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#82-%E7%A4%BA%E4%BE%8B"}},[t._v("8.2 示例")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#821-%E6%BA%90%E6%96%87%E4%BB%B6test5c"}},[t._v("8.2.1 源文件test5.c")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#822-%E8%B0%83%E8%AF%95%E8%BF%87%E7%A8%8B"}},[t._v("8.2.2 调试过程")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#9-core%E6%96%87%E4%BB%B6%E8%B0%83%E8%AF%95"}},[t._v("9 core文件调试")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#91-%E4%BD%BF%E7%94%A8%E5%91%BD%E4%BB%A4"}},[t._v("9.1 使用命令")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#92-%E7%A4%BA%E4%BE%8B"}},[t._v("9.2 示例")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#921-%E6%BA%90%E4%BB%A3%E7%A0%81test6c"}},[t._v("9.2.1 源代码test6.c")])]),t._v(" "),n("p",[n("a",{attrs:{href:"#922-%E8%B0%83%E8%AF%95%E8%BF%87%E7%A8%8B"}},[t._v("9.2.2 调试过程")])]),t._v(" "),n("h1",{attrs:{id:"_0-用gdb调试程序"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_0-用gdb调试程序"}},[t._v("#")]),t._v(" 0 用GDB调试程序")]),t._v(" "),n("h2",{attrs:{id:"_0-1-gdb概述"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_0-1-gdb概述"}},[t._v("#")]),t._v(" 0.1 GDB概述")]),t._v(" "),n("p",[t._v("GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓“寸有所长,尺有所短”就是这个道理。")]),t._v(" "),n("p",[t._v("一般来说,GDB主要帮忙你完成下面四个方面的功能:")]),t._v(" "),n("p",[t._v("1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。")]),t._v(" "),n("p",[t._v("2、调试的程序在你所指定的断点处停住。(断点可以是条件表达式)")]),t._v(" "),n("p",[t._v("3、程序被停住时,可以检查此时你的程序中所发生的事。")]),t._v(" "),n("p",[t._v("4、动态的改变你程序的执行环境。")]),t._v(" "),n("p",[t._v("从上面看来,GDB和一般的调试工具没有什么两样,基本上也是完成这些功能,不过在细节上,你会发现GDB这个调试工具的强大,大家可能比较习惯了图形化的调试工具,但有时候,命令行的调试工具却有着图形化工具所不能完成的功能。让我们一一看来。")]),t._v(" "),n("h2",{attrs:{id:"_0-2-调试示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_0-2-调试示例"}},[t._v("#")]),t._v(" 0.2 调试示例")]),t._v(" "),n("h3",{attrs:{id:"_0-2-1-源代码test1-c"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_0-2-1-源代码test1-c"}},[t._v("#")]),t._v(" 0.2.1 源代码test1.c")]),t._v(" "),n("div",{staticClass:"language-c line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-c"}},[n("code",[n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1.")]),t._v("#include "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("stdio"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("h"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2.")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3.")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("func")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("4.")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" sum"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("6.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("7.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("8.")]),t._v(" sum"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("9.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("10.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" sum"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("11.")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("12.")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("13.")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("14.")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("main")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("15.")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("17.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("18.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" result "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("19.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" m "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("20.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("p "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("m"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("21.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("22.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("23.")]),t._v(" result "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("24.")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("25.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("6")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" j"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("26.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("27.")]),t._v(" m"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("28.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("29.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("30.")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("31.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("printf")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"result[1-100] = %d \\n"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" result "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("32.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("printf")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"result[1-250] = %d \\n"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("func")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("250")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("33.")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("34.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("35.")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br"),n("span",{staticClass:"line-number"},[t._v("21")]),n("br"),n("span",{staticClass:"line-number"},[t._v("22")]),n("br"),n("span",{staticClass:"line-number"},[t._v("23")]),n("br"),n("span",{staticClass:"line-number"},[t._v("24")]),n("br"),n("span",{staticClass:"line-number"},[t._v("25")]),n("br"),n("span",{staticClass:"line-number"},[t._v("26")]),n("br"),n("span",{staticClass:"line-number"},[t._v("27")]),n("br"),n("span",{staticClass:"line-number"},[t._v("28")]),n("br"),n("span",{staticClass:"line-number"},[t._v("29")]),n("br"),n("span",{staticClass:"line-number"},[t._v("30")]),n("br"),n("span",{staticClass:"line-number"},[t._v("31")]),n("br"),n("span",{staticClass:"line-number"},[t._v("32")]),n("br"),n("span",{staticClass:"line-number"},[t._v("33")]),n("br"),n("span",{staticClass:"line-number"},[t._v("34")]),n("br"),n("span",{staticClass:"line-number"},[t._v("35")]),n("br")])]),n("h3",{attrs:{id:"_0-2-2-调试过程"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_0-2-2-调试过程"}},[t._v("#")]),t._v(" 0.2.2 调试过程")]),t._v(" "),n("p",[t._v("编译生成执行文件:")]),t._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[t._v("root@luo:~/workspace/test/ exec"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("gcc -g test1.c -o test1\n使用GDB调试:\nroot@luo:~/workspace/test/exec"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("gdb test1-------------- 启动GDB\nGNU gdb "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("Wind River Linux Sourcery CodeBench "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("4.8")]),t._v("-45"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("7.6")]),t._v("\nCopyright "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("C"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2013")]),t._v(" Free Software Foundation, Inc.\nLicense GPLv3+: GNU GPL version "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),t._v(" or later "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("http://gnu.org/licenses/gpl.html"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\nThis is "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("free")]),t._v(" software: you are "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("free")]),t._v(" to change and redistribute it.\nThere is NO WARRANTY, to the extent permitted by law. Type "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"show copying"')]),t._v("\nand "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"show warranty"')]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" details.\nThis GDB was configured as "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"x86_64-wrs-linux-gnu"')]),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(".")]),t._v("\nFor bug reporting instructions, please see:\n"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("support@windriver.com"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\nReading symbols from /home/luo/workspace/test/exec/test1"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".done.\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" l "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("-------------- 从第一行开始列出源码,l为list缩写\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\t"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#include ")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v("\t\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),t._v("\tint func"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("int n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),t._v("\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),t._v("\t\tint "),n("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("sum")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(",i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("6")]),t._v("\t\tfor"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i++"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("7")]),t._v("\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("8")]),t._v("\t\t\t"),n("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("sum")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("9")]),t._v("\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),t._v("\t\t"),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("sum")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" -------------- 直接回车表示重复上一次命令\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("11")]),t._v("\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("12")]),t._v("\t\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("13")]),t._v("\t\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("14")]),t._v("\tint main"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("15")]),t._v("\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("16")]),t._v("\t\tint i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("17")]),t._v("\t\tint j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("18")]),t._v("\t\tint result "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("19")]),t._v("\t\tint m "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),t._v("\t\tint *p "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("m"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("break")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("16")]),t._v(" -------------- 设置断点,在源程序第16行\nBreakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" at 0x400566: "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("file")]),t._v(" test1.c, line "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("16")]),t._v(".\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("break")]),t._v(" func -------------- 设置断点,在func"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("函数入口处\nBreakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" at 0x400537: "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("file")]),t._v(" test1.c, line "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),t._v(".\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" info "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("break")]),t._v(" -------------- 显示断点信息\nNum Type Disp Enb Address What\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" breakpoint keep y 0x0000000000400566 "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" main at test1.c:16\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" breakpoint keep y 0x0000000000400537 "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" func at test1.c:5\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" r -------------- 运行程序,r为run简写\nStarting program: /home/luo/workspace/test/exec/test1 \nBreakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(", main "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" at test1.c:16\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("16")]),t._v("\t\tint i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" n -------------- 单条语句执行,next命令简写\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("17")]),t._v("\t\tint j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" n\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("18")]),t._v("\t\tint result "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" n\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("19")]),t._v("\t\tint m "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" n\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),t._v("\t\tint *p "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("m"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" c -------------- 继续运行程序,continue命令简写\nContinuing.\nresult"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("-100"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("6")]),t._v(" -------------- 程序输出\n\nBreakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(", func "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("n"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("250")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" at test1.c:5\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),t._v("\t\tint "),n("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("sum")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(",i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" n\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("6")]),t._v("\t\tfor"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i++"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" n\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("8")]),t._v("\t\t\t"),n("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("sum")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" p i -------------- 打印变量i的值,p为print命令简写\n"),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$1")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" n\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("6")]),t._v("\t\tfor"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i++"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" n\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("8")]),t._v("\t\t\t"),n("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("sum")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" p "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("sum")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$2")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" n\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("6")]),t._v("\t\tfor"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i++"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" p i\n"),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$3")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" n\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("8")]),t._v("\t\t\t"),n("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("sum")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" n\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("6")]),t._v("\t\tfor"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i++"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" p "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("sum")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$4")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" bt -------------- 查看函数堆栈\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#0 func (n=250) at test1.c:6")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#1 0x00000000004005dd in main () at test1.c:32")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" finish -------------- 退出函数\nRun till "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("exit")]),t._v(" from "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#0 func (n=250) at test1.c:6")]),t._v("\n0x00000000004005dd "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" main "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" at test1.c:32\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("32")]),t._v("\t\tprintf"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"result[1-250] = %d '),n("span",{pre:!0,attrs:{class:"token entity",title:"\\n"}},[t._v("\\n")]),t._v('"')]),t._v(", func"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("250")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nValue returned is "),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$5")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("31125")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" c -------------- 继续运行\nContinuing.\nresult"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("-250"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("31125")]),t._v(" -------------- 程序输出\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("Inferior "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("process "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("46602")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" exited normally"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" ------------ 程序退出,调试结束\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" q -------------- 退出GDB\nroot@luo:~/workspace/test/exec"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br"),n("span",{staticClass:"line-number"},[t._v("21")]),n("br"),n("span",{staticClass:"line-number"},[t._v("22")]),n("br"),n("span",{staticClass:"line-number"},[t._v("23")]),n("br"),n("span",{staticClass:"line-number"},[t._v("24")]),n("br"),n("span",{staticClass:"line-number"},[t._v("25")]),n("br"),n("span",{staticClass:"line-number"},[t._v("26")]),n("br"),n("span",{staticClass:"line-number"},[t._v("27")]),n("br"),n("span",{staticClass:"line-number"},[t._v("28")]),n("br"),n("span",{staticClass:"line-number"},[t._v("29")]),n("br"),n("span",{staticClass:"line-number"},[t._v("30")]),n("br"),n("span",{staticClass:"line-number"},[t._v("31")]),n("br"),n("span",{staticClass:"line-number"},[t._v("32")]),n("br"),n("span",{staticClass:"line-number"},[t._v("33")]),n("br"),n("span",{staticClass:"line-number"},[t._v("34")]),n("br"),n("span",{staticClass:"line-number"},[t._v("35")]),n("br"),n("span",{staticClass:"line-number"},[t._v("36")]),n("br"),n("span",{staticClass:"line-number"},[t._v("37")]),n("br"),n("span",{staticClass:"line-number"},[t._v("38")]),n("br"),n("span",{staticClass:"line-number"},[t._v("39")]),n("br"),n("span",{staticClass:"line-number"},[t._v("40")]),n("br"),n("span",{staticClass:"line-number"},[t._v("41")]),n("br"),n("span",{staticClass:"line-number"},[t._v("42")]),n("br"),n("span",{staticClass:"line-number"},[t._v("43")]),n("br"),n("span",{staticClass:"line-number"},[t._v("44")]),n("br"),n("span",{staticClass:"line-number"},[t._v("45")]),n("br"),n("span",{staticClass:"line-number"},[t._v("46")]),n("br"),n("span",{staticClass:"line-number"},[t._v("47")]),n("br"),n("span",{staticClass:"line-number"},[t._v("48")]),n("br"),n("span",{staticClass:"line-number"},[t._v("49")]),n("br"),n("span",{staticClass:"line-number"},[t._v("50")]),n("br"),n("span",{staticClass:"line-number"},[t._v("51")]),n("br"),n("span",{staticClass:"line-number"},[t._v("52")]),n("br"),n("span",{staticClass:"line-number"},[t._v("53")]),n("br"),n("span",{staticClass:"line-number"},[t._v("54")]),n("br"),n("span",{staticClass:"line-number"},[t._v("55")]),n("br"),n("span",{staticClass:"line-number"},[t._v("56")]),n("br"),n("span",{staticClass:"line-number"},[t._v("57")]),n("br"),n("span",{staticClass:"line-number"},[t._v("58")]),n("br"),n("span",{staticClass:"line-number"},[t._v("59")]),n("br"),n("span",{staticClass:"line-number"},[t._v("60")]),n("br"),n("span",{staticClass:"line-number"},[t._v("61")]),n("br"),n("span",{staticClass:"line-number"},[t._v("62")]),n("br"),n("span",{staticClass:"line-number"},[t._v("63")]),n("br"),n("span",{staticClass:"line-number"},[t._v("64")]),n("br"),n("span",{staticClass:"line-number"},[t._v("65")]),n("br"),n("span",{staticClass:"line-number"},[t._v("66")]),n("br"),n("span",{staticClass:"line-number"},[t._v("67")]),n("br"),n("span",{staticClass:"line-number"},[t._v("68")]),n("br"),n("span",{staticClass:"line-number"},[t._v("69")]),n("br"),n("span",{staticClass:"line-number"},[t._v("70")]),n("br"),n("span",{staticClass:"line-number"},[t._v("71")]),n("br"),n("span",{staticClass:"line-number"},[t._v("72")]),n("br"),n("span",{staticClass:"line-number"},[t._v("73")]),n("br"),n("span",{staticClass:"line-number"},[t._v("74")]),n("br"),n("span",{staticClass:"line-number"},[t._v("75")]),n("br"),n("span",{staticClass:"line-number"},[t._v("76")]),n("br"),n("span",{staticClass:"line-number"},[t._v("77")]),n("br"),n("span",{staticClass:"line-number"},[t._v("78")]),n("br"),n("span",{staticClass:"line-number"},[t._v("79")]),n("br"),n("span",{staticClass:"line-number"},[t._v("80")]),n("br"),n("span",{staticClass:"line-number"},[t._v("81")]),n("br"),n("span",{staticClass:"line-number"},[t._v("82")]),n("br"),n("span",{staticClass:"line-number"},[t._v("83")]),n("br"),n("span",{staticClass:"line-number"},[t._v("84")]),n("br"),n("span",{staticClass:"line-number"},[t._v("85")]),n("br"),n("span",{staticClass:"line-number"},[t._v("86")]),n("br"),n("span",{staticClass:"line-number"},[t._v("87")]),n("br"),n("span",{staticClass:"line-number"},[t._v("88")]),n("br"),n("span",{staticClass:"line-number"},[t._v("89")]),n("br"),n("span",{staticClass:"line-number"},[t._v("90")]),n("br"),n("span",{staticClass:"line-number"},[t._v("91")]),n("br"),n("span",{staticClass:"line-number"},[t._v("92")]),n("br"),n("span",{staticClass:"line-number"},[t._v("93")]),n("br"),n("span",{staticClass:"line-number"},[t._v("94")]),n("br"),n("span",{staticClass:"line-number"},[t._v("95")]),n("br"),n("span",{staticClass:"line-number"},[t._v("96")]),n("br"),n("span",{staticClass:"line-number"},[t._v("97")]),n("br")])]),n("h2",{attrs:{id:"_0-3-使用gdb"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_0-3-使用gdb"}},[t._v("#")]),t._v(" 0.3 使用GDB")]),t._v(" "),n("p",[t._v("一般来说GDB主要调试的是C/C++的程序。要调试C/C++的程序,首先在编译时,我们必须要把调试信息加到可执行文件中。使用编译器(cc/gcc/g++)的 -g 参数可以做到这一点。如:")]),t._v(" "),n("p",[t._v("> cc -g hello.c -o hello")]),t._v(" "),n("p",[t._v("> g++ -g hello.cpp -o hello")]),t._v(" "),n("p",[t._v("如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。当你用-g把调试信息加入之后,并成功编译目标代码以后,让我们来看看如何用gdb来调试他。")]),t._v(" "),n("h3",{attrs:{id:"_0-3-1-启动gdb"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_0-3-1-启动gdb"}},[t._v("#")]),t._v(" 0.3.1 启动GDB")]),t._v(" "),n("p",[t._v("启动GDB的方法有以下几种:")]),t._v(" "),n("p",[t._v("1、gdb ")]),t._v(" "),n("p",[t._v("program也就是你的执行文件,一般在当然目录下。")]),t._v(" "),n("p",[t._v("2、gdb core")]),t._v(" "),n("p",[t._v("用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件。")]),t._v(" "),n("p",[t._v("3、gdb ")]),t._v(" "),n("p",[t._v("如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。gdb会自动attach上去,并调试他。program应该在PATH环境变量中搜索得到。")]),t._v(" "),n("p",[t._v("GDB启动时,可以加上一些GDB的启动开关,详细的开关可以用gdb -help查看。下面只例举一些比较常用的参数:")]),t._v(" "),n("p",[t._v("-symbols ")]),t._v(" "),n("p",[t._v("-s ")]),t._v(" "),n("p",[t._v("从指定文件中读取符号表。")]),t._v(" "),n("p",[t._v("-se file")]),t._v(" "),n("p",[t._v("指定文件中读取符号表信息,并把他用在可执行文件中。")]),t._v(" "),n("p",[t._v("-core ")]),t._v(" "),n("p",[t._v("-c ")]),t._v(" "),n("p",[t._v("调试时core dump的core文件。")]),t._v(" "),n("p",[t._v("-directory ")]),t._v(" "),n("p",[t._v("-d ")]),t._v(" "),n("p",[t._v("加入一个源文件的搜索路径。默认搜索路径是环境变量中PATH所定义的路径。")]),t._v(" "),n("h3",{attrs:{id:"_0-3-2-gdb环境中使用shell命令"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_0-3-2-gdb环境中使用shell命令"}},[t._v("#")]),t._v(" 0.3.2 GDB环境中使用shell命令")]),t._v(" "),n("p",[t._v("在gdb环境中,你可以执行UNIX的shell的命令,使用gdb的shell命令来完成:")]),t._v(" "),n("p",[n("strong",[t._v("shell ")])]),t._v(" "),n("p",[t._v("调用UNIX的shell来执行,环境变量SHELL中定义的UNIX的shell将会被用来执行,如果SHELL没有定义,那就使用UNIX的标准shell:/bin/sh。(在Windows中使用Command.com或cmd.exe)")]),t._v(" "),n("p",[t._v("还有一个gdb命令是make:")]),t._v(" "),n("p",[n("strong",[t._v("make ")])]),t._v(" "),n("p",[t._v("可以在gdb中执行make命令来重新build自己的程序。这个命令等价于“shell make ”。")]),t._v(" "),n("h3",{attrs:{id:"_0-3-3-在gdb中运行程序"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_0-3-3-在gdb中运行程序"}},[t._v("#")]),t._v(" 0.3.3 在GDB中运行程序")]),t._v(" "),n("p",[t._v("当以gdb 方式启动gdb后,gdb会在PATH路径和当前目录中搜索的源文件。如要确认gdb是否读到源文件,可使用l或list命令,看看gdb是否能列出源代码。")]),t._v(" "),n("p",[t._v("在gdb中,运行程序使用r或是run命令。程序的运行,你有可能需要设置下面四方面的事。")]),t._v(" "),n("p",[t._v("1、程序运行参数。")]),t._v(" "),n("p",[t._v("set args 可指定运行时参数。(如:set args 10 20 30 40 50)")]),t._v(" "),n("p",[t._v("show args 命令可以查看设置好的运行参数。")]),t._v(" "),n("p",[t._v("2、运行环境。")]),t._v(" "),n("p",[t._v("path 可设定程序的运行路径。")]),t._v(" "),n("p",[t._v("show paths 查看程序的运行路径。")]),t._v(" "),n("p",[t._v("set environment varname [=value] 设置环境变量。如:set env USER=aaa")]),t._v(" "),n("p",[t._v("show environment [varname] 查看环境变量。")]),t._v(" "),n("p",[t._v("3、工作目录。")]),t._v(" "),n("p",[t._v("cd 相当于shell的cd命令。")]),t._v(" "),n("p",[t._v("pwd 显示当前的所在目录。")]),t._v(" "),n("p",[t._v("4、程序的输入输出。")]),t._v(" "),n("p",[t._v("info terminal 显示你程序用到的终端的模式。")]),t._v(" "),n("p",[t._v("使用重定向控制程序输出。如:run > outfile")]),t._v(" "),n("p",[t._v("tty命令可以指写输入输出的终端设备。如:tty /dev/ttyb。")]),t._v(" "),n("h1",{attrs:{id:"_1-设置断点"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_1-设置断点"}},[t._v("#")]),t._v(" 1 设置断点")]),t._v(" "),n("h2",{attrs:{id:"_1-1-使用命令"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_1-1-使用命令"}},[t._v("#")]),t._v(" 1.1 使用命令")]),t._v(" "),n("p",[n("strong",[t._v("break linenum")])]),t._v(" "),n("p",[t._v("在指定行号设置断点。")]),t._v(" "),n("p",[n("strong",[t._v("break function")])]),t._v(" "),n("p",[t._v("在函数function的入口处设置断点。C++中可以使用class::function或function(type,type)格式来指定函数名。")]),t._v(" "),n("p",[n("strong",[t._v("break +offset/-offset")])]),t._v(" "),n("p",[t._v("在当前行前面或后面offset行设置断点,offset为自然数。")]),t._v(" "),n("p",[n("strong",[t._v("break filename:linenum")])]),t._v(" "),n("p",[t._v("在源文件filename的linenum行处设置断点。")]),t._v(" "),n("p",[n("strong",[t._v("break filename:function")])]),t._v(" "),n("p",[t._v("在源文件filename的function函数的入口处设置断点。")]),t._v(" "),n("p",[n("strong",[t._v("break")])]),t._v(" "),n("p",[t._v("break命令没有参数时,表示在下一条指令处设置断点。")]),t._v(" "),n("p",[n("strong",[t._v("break args if cond")])]),t._v(" "),n("p",[t._v("设置一个带有条件cond的断点,只有条件为“真”时才停止。args代表上述参数之一。")]),t._v(" "),n("p",[n("strong",[t._v("delete [breakpoint num]")])]),t._v(" "),n("p",[t._v("删除断点,breakpoint num为断点号。")]),t._v(" "),n("p",[n("strong",[t._v("tbreak args")])]),t._v(" "),n("p",[t._v("设置仅停止一次的断点。args与上面break命令的相同。程序在该断点停止后,该断点便立即被删除。")]),t._v(" "),n("h2",{attrs:{id:"_1-2-示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_1-2-示例"}},[t._v("#")]),t._v(" 1.2 示例")]),t._v(" "),n("p",[t._v("源代码test1.c 同上")]),t._v(" "),n("h3",{attrs:{id:"_1-2-1-调试过程"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_1-2-1-调试过程"}},[t._v("#")]),t._v(" 1.2.1 调试过程")]),t._v(" "),n("p",[t._v("编译生成可执行文件,注意要带上 "),n("em",[t._v("-g")]),t._v(" :")]),t._v(" "),n("p",[n("em",[t._v("root@luo:~/workspace/test/source\\>gcc -g test.c -o ../exec/test")])]),t._v(" "),n("p",[t._v("使用GDB调试:")]),t._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[t._v("\nroot@luo:~/workspace/test/source"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("gcc -g test.c -o "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v("/exec/test\n使用GDB调试:\nroot@luo:~/workspace/test/exec"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("gdb "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("test")]),t._v(" \nGNU gdb "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("Wind River Linux Sourcery CodeBench "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("4.8")]),t._v("-45"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("7.6")]),t._v("\nCopyright "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("C"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2013")]),t._v(" Free Software Foundation, Inc.\nLicense GPLv3+: GNU GPL version "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),t._v(" or later "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("http://gnu.org/licenses/gpl.html"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\nThis is "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("free")]),t._v(" software: you are "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("free")]),t._v(" to change and redistribute it.\nThere is NO WARRANTY, to the extent permitted by law. Type "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"show copying"')]),t._v("\nand "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"show warranty"')]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" details.\nThis GDB was configured as "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"x86_64-wrs-linux-gnu"')]),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(".")]),t._v("\nFor bug reporting instructions, please see:\n"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("support@windriver.com"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\nReading symbols from /home/luo/workspace/test/exec/test"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".done.\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" l "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" -------------- l为list的简写,从第一行开始列出源码\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\t"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#include ")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v("\t\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),t._v("\tint func"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("int n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),t._v("\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),t._v("\t\tint "),n("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("sum")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(",i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("6")]),t._v("\t\tfor"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i++"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("7")]),t._v("\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("8")]),t._v("\t\t\t"),n("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("sum")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("9")]),t._v("\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),t._v("\t\t"),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("sum")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" -------------- 直接回车,表示重复上一次命令\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("11")]),t._v("\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("12")]),t._v("\t\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("13")]),t._v("\t\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("14")]),t._v("\tint main"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("15")]),t._v("\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("16")]),t._v("\t\tint i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("17")]),t._v("\t\tint j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("18")]),t._v("\t\tint result "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("19")]),t._v("\t\tint m "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),t._v("\t\tint *p "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("m"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("21")]),t._v("\t\tfor"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i++"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("22")]),t._v("\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("23")]),t._v("\t\t\tresult "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("24")]),t._v("\t \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("25")]),t._v("\t\t\tfor"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("6")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" j++"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("26")]),t._v("\t\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("27")]),t._v("\t\t\t\tm++"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("28")]),t._v("\t\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("29")]),t._v("\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("30")]),t._v("\t\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("31")]),t._v("\t\tprintf"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"result[1-100] = %d '),n("span",{pre:!0,attrs:{class:"token entity",title:"\\n"}},[t._v("\\n")]),t._v('"')]),t._v(", result "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("32")]),t._v("\t\tprintf"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"result[1-250] = %d '),n("span",{pre:!0,attrs:{class:"token entity",title:"\\n"}},[t._v("\\n")]),t._v('"')]),t._v(", func"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("250")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("33")]),t._v("\t\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("34")]),t._v("\t\t"),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("35")]),t._v("\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("break")]),t._v(" main -------------- 设置断点,在函数main"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("入口处。\nBreakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" at 0x400566: "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("file")]),t._v(" test.c, line "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("17")]),t._v(".\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("break")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("21")]),t._v(" -------------- 设置断点,在源程序第21行\nBreakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" at 0x400585: "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("file")]),t._v(" test.c, line "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("21")]),t._v(".\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("break")]),t._v(" test.c:func -------------- 设置断点,在test.c文件的func"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("函数入口处\nBreakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),t._v(" at 0x400537: "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("file")]),t._v(" test.c, line "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),t._v(".\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" r -------------- 运行程序,run命令简写\nStarting program: /home/luo/workspace/test/exec/test \n\nBreakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(", main "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" at test.c:17 ---------- 程序在main"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("入口停止\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("17")]),t._v("\t\tint j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" c -------------- 继续运行程序,continue命令的简写\nContinuing.\n\nBreakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(", main "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" at test.c:22 -------------- 程序在22行停止\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("22")]),t._v("\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" tbreak "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("26")]),t._v(" -------------- 设置临时断点,在26行\nTemporary breakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),t._v(" at 0x400594: "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("file")]),t._v(" test.c, line "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("26")]),t._v(".\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" info b -------------- 查看断点信息\nNum Type Disp Enb Address What\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" breakpoint keep y 0x0000000000400566 "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" main at test.c:17\n\tbreakpoint already hit "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("time")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" breakpoint keep y 0x0000000000400585 "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" main at test.c:21\n\tbreakpoint already hit "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("time")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),t._v(" breakpoint keep y 0x0000000000400537 "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" func at test.c:5\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),t._v(" breakpoint del y 0x0000000000400594 "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" main at test.c:26\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" c -------------- 继续运行程序\nContinuing.\n\nTemporary breakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),t._v(", main "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" at test.c:26 --------------程序在26行停止\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("26")]),t._v("\t\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" info b -------------- 再查看断点信息,临时断点已删除\nNum Type Disp Enb Address What\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" breakpoint keep y 0x0000000000400566 "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" main at test.c:17\n\tbreakpoint already hit "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("time")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" breakpoint keep y 0x0000000000400585 "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" main at test.c:21\n\tbreakpoint already hit "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("time")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),t._v(" breakpoint keep y 0x0000000000400537 "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" func at test.c:5\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("break")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("27")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" m "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),t._v(" ------------ 设置断点,在27行,当m"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),t._v("时生效\nBreakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),t._v(" at 0x4005b1: "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("file")]),t._v(" test.c, line "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("27")]),t._v(".\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" c -------------- 继续运行程序\nContinuing.\n\nBreakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(", main "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" at test.c:22 ------------ 程序在22行停止\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("22")]),t._v("\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" c -------------- 继续运行程序\nContinuing.\n\nBreakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(", main "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" at test.c:22\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("22")]),t._v("\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" c -------------- 继续运行程序\nContinuing.\n\nBreakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),t._v(", main "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" at test.c:30 -------------- 程序在30行停止\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("30")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" print "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"%d"')]),t._v(", m -------------- 打印m的值\n"),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$1")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),t._v(" -------------- 此时m "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" c -------------- 继续运行程序\nContinuing.\nresult"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("-100"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("6")]),t._v(" \n\nBreakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),t._v(", func "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("n"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("250")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" at test.c:5 ---------- 程序在func"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("函数入口处停止\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),t._v("\t\tint "),n("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("sum")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(",i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" tbreak +3 -------------- 在当前行+3行处设置临时断点\nTemporary breakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("8")]),t._v(" at 0x400547: "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("file")]),t._v(" test.c, line "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("8")]),t._v(".\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" c -------------- 继续运行程序\nContinuing.\nTemporary breakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("8")]),t._v(", func "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("n"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("250")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" at test.c:8\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("8")]),t._v("\t\t\t"),n("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("sum")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("break")]),t._v(" -------------- 在下一条指令处设置断点\nBreakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("9")]),t._v(" at 0x400547: "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("file")]),t._v(" test.c, line "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("8")]),t._v(".\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" c -------------- 继续运行程序\nContinuing.\nBreakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("9")]),t._v(", func "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("n"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("250")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" at test.c:8 -------------- 在第8行停止\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("8")]),t._v("\t\t\t"),n("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("sum")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" c -------------- 继续运行程序\nContinuing.\nBreakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("9")]),t._v(", func "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("n"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("250")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" at test.c:8 -------------- 在第8行停止\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("8")]),t._v("\t\t\t"),n("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("sum")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("clear")]),t._v(" --------------清楚所有断点\nDeleted breakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("9")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" c -------------- 继续运行程序\nContinuing.\nresult"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("-250"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("31125")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br"),n("span",{staticClass:"line-number"},[t._v("21")]),n("br"),n("span",{staticClass:"line-number"},[t._v("22")]),n("br"),n("span",{staticClass:"line-number"},[t._v("23")]),n("br"),n("span",{staticClass:"line-number"},[t._v("24")]),n("br"),n("span",{staticClass:"line-number"},[t._v("25")]),n("br"),n("span",{staticClass:"line-number"},[t._v("26")]),n("br"),n("span",{staticClass:"line-number"},[t._v("27")]),n("br"),n("span",{staticClass:"line-number"},[t._v("28")]),n("br"),n("span",{staticClass:"line-number"},[t._v("29")]),n("br"),n("span",{staticClass:"line-number"},[t._v("30")]),n("br"),n("span",{staticClass:"line-number"},[t._v("31")]),n("br"),n("span",{staticClass:"line-number"},[t._v("32")]),n("br"),n("span",{staticClass:"line-number"},[t._v("33")]),n("br"),n("span",{staticClass:"line-number"},[t._v("34")]),n("br"),n("span",{staticClass:"line-number"},[t._v("35")]),n("br"),n("span",{staticClass:"line-number"},[t._v("36")]),n("br"),n("span",{staticClass:"line-number"},[t._v("37")]),n("br"),n("span",{staticClass:"line-number"},[t._v("38")]),n("br"),n("span",{staticClass:"line-number"},[t._v("39")]),n("br"),n("span",{staticClass:"line-number"},[t._v("40")]),n("br"),n("span",{staticClass:"line-number"},[t._v("41")]),n("br"),n("span",{staticClass:"line-number"},[t._v("42")]),n("br"),n("span",{staticClass:"line-number"},[t._v("43")]),n("br"),n("span",{staticClass:"line-number"},[t._v("44")]),n("br"),n("span",{staticClass:"line-number"},[t._v("45")]),n("br"),n("span",{staticClass:"line-number"},[t._v("46")]),n("br"),n("span",{staticClass:"line-number"},[t._v("47")]),n("br"),n("span",{staticClass:"line-number"},[t._v("48")]),n("br"),n("span",{staticClass:"line-number"},[t._v("49")]),n("br"),n("span",{staticClass:"line-number"},[t._v("50")]),n("br"),n("span",{staticClass:"line-number"},[t._v("51")]),n("br"),n("span",{staticClass:"line-number"},[t._v("52")]),n("br"),n("span",{staticClass:"line-number"},[t._v("53")]),n("br"),n("span",{staticClass:"line-number"},[t._v("54")]),n("br"),n("span",{staticClass:"line-number"},[t._v("55")]),n("br"),n("span",{staticClass:"line-number"},[t._v("56")]),n("br"),n("span",{staticClass:"line-number"},[t._v("57")]),n("br"),n("span",{staticClass:"line-number"},[t._v("58")]),n("br"),n("span",{staticClass:"line-number"},[t._v("59")]),n("br"),n("span",{staticClass:"line-number"},[t._v("60")]),n("br"),n("span",{staticClass:"line-number"},[t._v("61")]),n("br"),n("span",{staticClass:"line-number"},[t._v("62")]),n("br"),n("span",{staticClass:"line-number"},[t._v("63")]),n("br"),n("span",{staticClass:"line-number"},[t._v("64")]),n("br"),n("span",{staticClass:"line-number"},[t._v("65")]),n("br"),n("span",{staticClass:"line-number"},[t._v("66")]),n("br"),n("span",{staticClass:"line-number"},[t._v("67")]),n("br"),n("span",{staticClass:"line-number"},[t._v("68")]),n("br"),n("span",{staticClass:"line-number"},[t._v("69")]),n("br"),n("span",{staticClass:"line-number"},[t._v("70")]),n("br"),n("span",{staticClass:"line-number"},[t._v("71")]),n("br"),n("span",{staticClass:"line-number"},[t._v("72")]),n("br"),n("span",{staticClass:"line-number"},[t._v("73")]),n("br"),n("span",{staticClass:"line-number"},[t._v("74")]),n("br"),n("span",{staticClass:"line-number"},[t._v("75")]),n("br"),n("span",{staticClass:"line-number"},[t._v("76")]),n("br"),n("span",{staticClass:"line-number"},[t._v("77")]),n("br"),n("span",{staticClass:"line-number"},[t._v("78")]),n("br"),n("span",{staticClass:"line-number"},[t._v("79")]),n("br"),n("span",{staticClass:"line-number"},[t._v("80")]),n("br"),n("span",{staticClass:"line-number"},[t._v("81")]),n("br"),n("span",{staticClass:"line-number"},[t._v("82")]),n("br"),n("span",{staticClass:"line-number"},[t._v("83")]),n("br"),n("span",{staticClass:"line-number"},[t._v("84")]),n("br"),n("span",{staticClass:"line-number"},[t._v("85")]),n("br"),n("span",{staticClass:"line-number"},[t._v("86")]),n("br"),n("span",{staticClass:"line-number"},[t._v("87")]),n("br"),n("span",{staticClass:"line-number"},[t._v("88")]),n("br"),n("span",{staticClass:"line-number"},[t._v("89")]),n("br"),n("span",{staticClass:"line-number"},[t._v("90")]),n("br"),n("span",{staticClass:"line-number"},[t._v("91")]),n("br"),n("span",{staticClass:"line-number"},[t._v("92")]),n("br"),n("span",{staticClass:"line-number"},[t._v("93")]),n("br"),n("span",{staticClass:"line-number"},[t._v("94")]),n("br"),n("span",{staticClass:"line-number"},[t._v("95")]),n("br"),n("span",{staticClass:"line-number"},[t._v("96")]),n("br"),n("span",{staticClass:"line-number"},[t._v("97")]),n("br"),n("span",{staticClass:"line-number"},[t._v("98")]),n("br"),n("span",{staticClass:"line-number"},[t._v("99")]),n("br"),n("span",{staticClass:"line-number"},[t._v("100")]),n("br"),n("span",{staticClass:"line-number"},[t._v("101")]),n("br"),n("span",{staticClass:"line-number"},[t._v("102")]),n("br"),n("span",{staticClass:"line-number"},[t._v("103")]),n("br"),n("span",{staticClass:"line-number"},[t._v("104")]),n("br"),n("span",{staticClass:"line-number"},[t._v("105")]),n("br"),n("span",{staticClass:"line-number"},[t._v("106")]),n("br"),n("span",{staticClass:"line-number"},[t._v("107")]),n("br"),n("span",{staticClass:"line-number"},[t._v("108")]),n("br"),n("span",{staticClass:"line-number"},[t._v("109")]),n("br"),n("span",{staticClass:"line-number"},[t._v("110")]),n("br"),n("span",{staticClass:"line-number"},[t._v("111")]),n("br"),n("span",{staticClass:"line-number"},[t._v("112")]),n("br"),n("span",{staticClass:"line-number"},[t._v("113")]),n("br"),n("span",{staticClass:"line-number"},[t._v("114")]),n("br"),n("span",{staticClass:"line-number"},[t._v("115")]),n("br"),n("span",{staticClass:"line-number"},[t._v("116")]),n("br"),n("span",{staticClass:"line-number"},[t._v("117")]),n("br"),n("span",{staticClass:"line-number"},[t._v("118")]),n("br"),n("span",{staticClass:"line-number"},[t._v("119")]),n("br"),n("span",{staticClass:"line-number"},[t._v("120")]),n("br"),n("span",{staticClass:"line-number"},[t._v("121")]),n("br"),n("span",{staticClass:"line-number"},[t._v("122")]),n("br"),n("span",{staticClass:"line-number"},[t._v("123")]),n("br"),n("span",{staticClass:"line-number"},[t._v("124")]),n("br"),n("span",{staticClass:"line-number"},[t._v("125")]),n("br"),n("span",{staticClass:"line-number"},[t._v("126")]),n("br"),n("span",{staticClass:"line-number"},[t._v("127")]),n("br"),n("span",{staticClass:"line-number"},[t._v("128")]),n("br"),n("span",{staticClass:"line-number"},[t._v("129")]),n("br"),n("span",{staticClass:"line-number"},[t._v("130")]),n("br"),n("span",{staticClass:"line-number"},[t._v("131")]),n("br"),n("span",{staticClass:"line-number"},[t._v("132")]),n("br"),n("span",{staticClass:"line-number"},[t._v("133")]),n("br"),n("span",{staticClass:"line-number"},[t._v("134")]),n("br"),n("span",{staticClass:"line-number"},[t._v("135")]),n("br"),n("span",{staticClass:"line-number"},[t._v("136")]),n("br"),n("span",{staticClass:"line-number"},[t._v("137")]),n("br"),n("span",{staticClass:"line-number"},[t._v("138")]),n("br")])]),n("h1",{attrs:{id:"_2-程序的单步执行"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_2-程序的单步执行"}},[t._v("#")]),t._v(" 2 程序的单步执行")]),t._v(" "),n("h2",{attrs:{id:"_2-1-使用命令"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_2-1-使用命令"}},[t._v("#")]),t._v(" 2.1 使用命令")]),t._v(" "),n("p",[n("strong",[t._v("step ")])]),t._v(" "),n("p",[t._v("单步跟踪,如果有函数调用,他会进入该函数。进入函数的前提是,此函数被编译有debug信息。后面可以加count也可以不加,不加表示一条条地执行,加表示执行后面的count条指令,然后再停住。")]),t._v(" "),n("p",[n("strong",[t._v("next ")])]),t._v(" "),n("p",[t._v("同样单步跟踪,如果有函数调用,他不会进入该函数。后面可以加count也可以不加,不加表示一条条地执行,加表示执行后面的count条指令,然后再停住。")]),t._v(" "),n("p",[n("strong",[t._v("finish")])]),t._v(" "),n("p",[t._v("运行程序,直到当前函数完成返回。并打印函数返回时的堆栈地址和返回值及参数值等信息。")]),t._v(" "),n("p",[n("strong",[t._v("until 或 u")])]),t._v(" "),n("p",[t._v("当你厌倦了在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体。")]),t._v(" "),n("h2",{attrs:{id:"_2-2-示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_2-2-示例"}},[t._v("#")]),t._v(" 2.2 示例")]),t._v(" "),n("p",[t._v("源代码test1.c 同上")]),t._v(" "),n("h3",{attrs:{id:"_2-2-1-调试过程"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_2-2-1-调试过程"}},[t._v("#")]),t._v(" 2.2.1 调试过程")]),t._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[t._v("root@luo:~/workspace/test/exec"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("gdb -q "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("test")]),t._v(" \n----- 启动GDB,-q使启动使版本信息不显示\nReading symbols from /home/luo/workspace/test/exec/test"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".done.\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("break")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("18")]),t._v(" -------------- 在第18行设置断点\nBreakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" at 0x400574: "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("file")]),t._v(" test.c, line "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("18")]),t._v(".\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" r -------------- 运行程序\nStarting program: /home/luo/workspace/test/exec/test \n\nBreakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(", main "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" at test.c:18 -------------- 在18行停止\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("18")]),t._v("\t\tint result "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" n -------------- 下一条\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("19")]),t._v("\t\tint m "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" n -------------- 下一条\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),t._v("\t\tint *p "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("m"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" s -------------- 下一条\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("21")]),t._v("\t\tfor"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i++"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" s -------------- 下一条\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("23")]),t._v("\t\t\tresult "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" n -------------- 下一条\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("25")]),t._v("\t\t\tfor"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("6")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" j++"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" n -------------- 下一条 \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("27")]),t._v("\t\t\t\tm++"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" u -------------- 运行函数到退出当前循环\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("25")]),t._v("\t\t\tfor"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("j"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("6")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" j++"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" u -------------- 运行程序到退出当前循环\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("21")]),t._v("\t\tfor"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i++"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" u -------------- 运行程序到退出当前循环\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("31")]),t._v("\t\tprintf"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"result[1-100] = %d '),n("span",{pre:!0,attrs:{class:"token entity",title:"\\n"}},[t._v("\\n")]),t._v('"')]),t._v(", result "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" s -------------- 下一条\nresult"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("-100"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("6")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("32")]),t._v("\t\tprintf"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"result[1-250] = %d '),n("span",{pre:!0,attrs:{class:"token entity",title:"\\n"}},[t._v("\\n")]),t._v('"')]),t._v(", func"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("250")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" s -------------- step下一条\nfunc "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("n"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("250")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" at test.c:5 -------------- 进入函数func"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),t._v("\t\tint "),n("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("sum")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(",i"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" finish -------------- 运行程序到函数完成\nRun till "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("exit")]),t._v(" from "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#0 func (n=250) at test.c:5")]),t._v("\n0x00000000004005dd "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" main "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" at test.c:32\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("32")]),t._v("\t\tprintf"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"result[1-250] = %d '),n("span",{pre:!0,attrs:{class:"token entity",title:"\\n"}},[t._v("\\n")]),t._v('"')]),t._v(", func"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("250")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nValue returned is "),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$1")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("31125")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" r -------------- 再次运行程序\nThe program being debugged has been started already.\nStart it from the beginning? "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("y or n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" y\nStarting program: /home/luo/workspace/test/exec/test \nBreakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(", main "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" at test.c:18 -------------- 程序在18行停止\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("18")]),t._v("\t\tint result "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("break")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("30")]),t._v(" -------------- 设置断点,在30行\nBreakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" at 0x4005bf: "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("file")]),t._v(" test.c, line "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("30")]),t._v(".\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" c -------------- 继续运行程序\nContinuing.\nBreakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(", main "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" at test.c:31 -------------- 程序在31行停止\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("31")]),t._v("\t\tprintf"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"result[1-100] = %d '),n("span",{pre:!0,attrs:{class:"token entity",title:"\\n"}},[t._v("\\n")]),t._v('"')]),t._v(", result "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" n -------------- next下一条\nresult"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("-100"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("6")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("32")]),t._v("\t\tprintf"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"result[1-250] = %d '),n("span",{pre:!0,attrs:{class:"token entity",title:"\\n"}},[t._v("\\n")]),t._v('"')]),t._v(", func"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("250")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" n -------------- next下一条\nresult"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("-250"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("31125")]),t._v(" -------------- 未进入函数func"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("34")]),t._v("\t\t"),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br"),n("span",{staticClass:"line-number"},[t._v("21")]),n("br"),n("span",{staticClass:"line-number"},[t._v("22")]),n("br"),n("span",{staticClass:"line-number"},[t._v("23")]),n("br"),n("span",{staticClass:"line-number"},[t._v("24")]),n("br"),n("span",{staticClass:"line-number"},[t._v("25")]),n("br"),n("span",{staticClass:"line-number"},[t._v("26")]),n("br"),n("span",{staticClass:"line-number"},[t._v("27")]),n("br"),n("span",{staticClass:"line-number"},[t._v("28")]),n("br"),n("span",{staticClass:"line-number"},[t._v("29")]),n("br"),n("span",{staticClass:"line-number"},[t._v("30")]),n("br"),n("span",{staticClass:"line-number"},[t._v("31")]),n("br"),n("span",{staticClass:"line-number"},[t._v("32")]),n("br"),n("span",{staticClass:"line-number"},[t._v("33")]),n("br"),n("span",{staticClass:"line-number"},[t._v("34")]),n("br"),n("span",{staticClass:"line-number"},[t._v("35")]),n("br"),n("span",{staticClass:"line-number"},[t._v("36")]),n("br"),n("span",{staticClass:"line-number"},[t._v("37")]),n("br"),n("span",{staticClass:"line-number"},[t._v("38")]),n("br"),n("span",{staticClass:"line-number"},[t._v("39")]),n("br"),n("span",{staticClass:"line-number"},[t._v("40")]),n("br"),n("span",{staticClass:"line-number"},[t._v("41")]),n("br"),n("span",{staticClass:"line-number"},[t._v("42")]),n("br"),n("span",{staticClass:"line-number"},[t._v("43")]),n("br"),n("span",{staticClass:"line-number"},[t._v("44")]),n("br"),n("span",{staticClass:"line-number"},[t._v("45")]),n("br"),n("span",{staticClass:"line-number"},[t._v("46")]),n("br"),n("span",{staticClass:"line-number"},[t._v("47")]),n("br"),n("span",{staticClass:"line-number"},[t._v("48")]),n("br"),n("span",{staticClass:"line-number"},[t._v("49")]),n("br"),n("span",{staticClass:"line-number"},[t._v("50")]),n("br"),n("span",{staticClass:"line-number"},[t._v("51")]),n("br"),n("span",{staticClass:"line-number"},[t._v("52")]),n("br"),n("span",{staticClass:"line-number"},[t._v("53")]),n("br"),n("span",{staticClass:"line-number"},[t._v("54")]),n("br"),n("span",{staticClass:"line-number"},[t._v("55")]),n("br"),n("span",{staticClass:"line-number"},[t._v("56")]),n("br"),n("span",{staticClass:"line-number"},[t._v("57")]),n("br"),n("span",{staticClass:"line-number"},[t._v("58")]),n("br")])]),n("h1",{attrs:{id:"_3-显示-修改变量的值"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_3-显示-修改变量的值"}},[t._v("#")]),t._v(" 3 显示/修改变量的值")]),t._v(" "),n("h2",{attrs:{id:"_3-1使用命令"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_3-1使用命令"}},[t._v("#")]),t._v(" 3.1使用命令")]),t._v(" "),n("p",[n("strong",[t._v("print ")])]),t._v(" "),n("p",[n("strong",[t._v("print / ")])]),t._v(" "),n("p",[t._v("当程序被停住时,可以使用print命令(简写为p),或同义命令inspect来查看当前程序的运行数据。是表达式,是你所调试的程序的语言的表达式(GDB可以调试多种编程语言),是输出的格式,比如,如果要把表达式按16进制的格式输出,那么就是/x。")]),t._v(" "),n("p",[n("strong",[t._v("注意")]),t._v(":GDB中,变量分为全局变量、静态全局变量、局部变量三种,当局部变量与全局变量发生重名时,用pirnt显示出的变量的值会是函数中的局部变量的值。此时如果要查看全局变量的值,可以使用“::”操作符:")]),t._v(" "),n("p",[n("strong",[t._v("file::variable")])]),t._v(" "),n("p",[n("strong",[t._v("function::variable")])]),t._v(" "),n("p",[t._v("可以通过这种形式查看某个文件或是某个函数的变量。")]),t._v(" "),n("h2",{attrs:{id:"_3-2示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_3-2示例"}},[t._v("#")]),t._v(" 3.2示例")]),t._v(" "),n("h3",{attrs:{id:"_3-2-1-源代码test2-c"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_3-2-1-源代码test2-c"}},[t._v("#")]),t._v(" 3.2.1 源代码test2.c")]),t._v(" "),n("div",{staticClass:"language-c line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-c"}},[n("code",[n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1.")]),t._v("#include "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("stdio"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("h"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2.")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3.")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("func")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" m"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("4.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" n "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("5.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("6.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" m"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("7.")]),t._v(" n "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),t._v(" m"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("8.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("9.")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("10.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("11.")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("12.")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("13.")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("14.")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("main")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("15.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("16.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" b "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("17.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" n "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("18.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" sum "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("19.")]),t._v(" sum "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("func")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("40")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("20.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("21.")]),t._v(" n"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("++")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("22.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("23.")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("24.")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br"),n("span",{staticClass:"line-number"},[t._v("21")]),n("br"),n("span",{staticClass:"line-number"},[t._v("22")]),n("br"),n("span",{staticClass:"line-number"},[t._v("23")]),n("br"),n("span",{staticClass:"line-number"},[t._v("24")]),n("br"),n("span",{staticClass:"line-number"},[t._v("25")]),n("br")])]),n("h3",{attrs:{id:"_3-2-2-调试过程"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_3-2-2-调试过程"}},[t._v("#")]),t._v(" 3.2.2 调试过程")]),t._v(" "),n("p",[t._v("编译生成可执行文件:")]),t._v(" "),n("p",[n("em",[t._v("root@luo:~/workspace/test/source\\>gcc -g test2.c -o ../exec/test2")])]),t._v(" "),n("p",[t._v("启动GDB:")]),t._v(" "),n("div",{staticClass:"language-sh line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-sh"}},[n("code",[t._v("\nroot@luo:~/workspace/test/source"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("gcc -g test2.c -o "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v("/exec/test2\n启动GDB:\nroot@luo:~/workspace/test/exec"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("gdb -q test2\nReading symbols from /home/luo/workspace/test/exec/test2"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".done.\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" l "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\t"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#include ")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v("\t\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),t._v("\tint func"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("int m"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),t._v("\t\tint n "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),t._v("\t\tint i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("6")]),t._v("\t\tfor"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" m"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i++"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("7")]),t._v("\t\t\tn "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+=")]),t._v(" m"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("8")]),t._v("\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("9")]),t._v("\t\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),t._v("\t\t"),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("return")]),t._v(" n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("11")]),t._v("\t\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("12")]),t._v("\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("13")]),t._v("\t\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("14")]),t._v("\tint "),n("span",{pre:!0,attrs:{class:"token function-name function"}},[t._v("main")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("15")]),t._v("\t\tint i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("16")]),t._v("\t\tint b "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("17")]),t._v("\t\tint n "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("18")]),t._v("\t\tint "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("sum")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("19")]),t._v("\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("sum")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" func"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("40")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),t._v("\t\tfor"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" i++"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("21")]),t._v("\t\t\tn++"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("22")]),t._v("\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("23")]),t._v("\t\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("24")]),t._v("\t\t"),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("return")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("25")]),t._v("\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("break")]),t._v(" func -------------- 设置断点,在func"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("函数入口处\nBreakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" at 0x4004f7: "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("file")]),t._v(" test2.c, line "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),t._v(".\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("break")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("21")]),t._v(" -------------- 设置断点,在21行\nBreakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" at 0x40055f: "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("file")]),t._v(" test2.c, line "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("21")]),t._v(".\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" r -------------- 运行程序\nStarting program: /home/luo/workspace/test/exec/test2 \n\nBreakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(", func "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("m"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("40")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" at test2.c:4\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),t._v("\t\tint n "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" p n -------------- 在func"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("函数内,显示变量n的值\n"),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$1")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" p main::n ------------ 在func"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("内,显示main"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("函数中n的值\n"),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$2")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),t._v(" \n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" c -------------- 继续运行程序\nContinuing.\n\nBreakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(", main "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" at test2.c:21\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("21")]),t._v("\t\t\tn++"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" p n -------------- 显示n的值\n"),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$3")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" p n "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("50")]),t._v(" -------------- 修改n的值为50\n"),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$4")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("50")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" p n -------------- 显示n的值\n"),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$5")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("50")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" c -------------- 继续运行程序\nContinuing.\n\nBreakpoint "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(", main "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" at test2.c:21\n"),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("21")]),t._v("\t\t\tn++"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" p n ------------ 显示n的值,可以看到,n在修改基础上加1\n"),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$6")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("51")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" p /x n ------------ 用16进制显示n值\n"),n("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$7")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" 0x33 \n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("gdb"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br"),n("span",{staticClass:"line-number"},[t._v("21")]),n("br"),n("span",{staticClass:"line-number"},[t._v("22")]),n("br"),n("span",{staticClass:"line-number"},[t._v("23")]),n("br"),n("span",{staticClass:"line-number"},[t._v("24")]),n("br"),n("span",{staticClass:"line-number"},[t._v("25")]),n("br"),n("span",{staticClass:"line-number"},[t._v("26")]),n("br"),n("span",{staticClass:"line-number"},[t._v("27")]),n("br"),n("span",{staticClass:"line-number"},[t._v("28")]),n("br"),n("span",{staticClass:"line-number"},[t._v("29")]),n("br"),n("span",{staticClass:"line-number"},[t._v("30")]),n("br"),n("span",{staticClass:"line-number"},[t._v("31")]),n("br"),n("span",{staticClass:"line-number"},[t._v("32")]),n("br"),n("span",{staticClass:"line-number"},[t._v("33")]),n("br"),n("span",{staticClass:"line-number"},[t._v("34")]),n("br"),n("span",{staticClass:"line-number"},[t._v("35")]),n("br"),n("span",{staticClass:"line-number"},[t._v("36")]),n("br"),n("span",{staticClass:"line-number"},[t._v("37")]),n("br"),n("span",{staticClass:"line-number"},[t._v("38")]),n("br"),n("span",{staticClass:"line-number"},[t._v("39")]),n("br"),n("span",{staticClass:"line-number"},[t._v("40")]),n("br"),n("span",{staticClass:"line-number"},[t._v("41")]),n("br"),n("span",{staticClass:"line-number"},[t._v("42")]),n("br"),n("span",{staticClass:"line-number"},[t._v("43")]),n("br"),n("span",{staticClass:"line-number"},[t._v("44")]),n("br"),n("span",{staticClass:"line-number"},[t._v("45")]),n("br"),n("span",{staticClass:"line-number"},[t._v("46")]),n("br"),n("span",{staticClass:"line-number"},[t._v("47")]),n("br"),n("span",{staticClass:"line-number"},[t._v("48")]),n("br"),n("span",{staticClass:"line-number"},[t._v("49")]),n("br"),n("span",{staticClass:"line-number"},[t._v("50")]),n("br"),n("span",{staticClass:"line-number"},[t._v("51")]),n("br"),n("span",{staticClass:"line-number"},[t._v("52")]),n("br"),n("span",{staticClass:"line-number"},[t._v("53")]),n("br"),n("span",{staticClass:"line-number"},[t._v("54")]),n("br"),n("span",{staticClass:"line-number"},[t._v("55")]),n("br"),n("span",{staticClass:"line-number"},[t._v("56")]),n("br"),n("span",{staticClass:"line-number"},[t._v("57")]),n("br"),n("span",{staticClass:"line-number"},[t._v("58")]),n("br"),n("span",{staticClass:"line-number"},[t._v("59")]),n("br"),n("span",{staticClass:"line-number"},[t._v("60")]),n("br"),n("span",{staticClass:"line-number"},[t._v("61")]),n("br"),n("span",{staticClass:"line-number"},[t._v("62")]),n("br"),n("span",{staticClass:"line-number"},[t._v("63")]),n("br"),n("span",{staticClass:"line-number"},[t._v("64")]),n("br"),n("span",{staticClass:"line-number"},[t._v("65")]),n("br"),n("span",{staticClass:"line-number"},[t._v("66")]),n("br"),n("span",{staticClass:"line-number"},[t._v("67")]),n("br")])]),n("h1",{attrs:{id:"_4-监视程序变量值"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_4-监视程序变量值"}},[t._v("#")]),t._v(" 4 监视程序变量值")]),t._v(" "),n("h2",{attrs:{id:"_4-1-使用命令"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_4-1-使用命令"}},[t._v("#")]),t._v(" 4.1 使用命令")]),t._v(" "),n("p",[n("strong",[t._v("display ")])]),t._v(" "),n("p",[n("strong",[t._v("display/ ")])]),t._v(" "),n("p",[n("strong",[t._v("display/ ")])]),t._v(" "),n("p",[t._v("display命令可以设置一些自动显示的变量,当程序停住时,或是在单步跟踪时,这些变量会自动显示。expr是一个表达式,fmt表示显示的格式,addr表示内存地址,当用display设定好了一个或多个表达式后,只要程序被停下来,GDB会自动显示你所设置的这些表达式的值。")]),t._v(" "),n("p",[n("strong",[t._v("undisplay ")])]),t._v(" "),n("p",[n("strong",[t._v("delete display ")])]),t._v(" "),n("p",[t._v("删除自动显示,dnums意为所设置好了的自动显式的编号。如果要同时删除几个,编号可以用空格分隔,如果要删除一个范围内的编号,可以用减号表示(如:2-5)。")]),t._v(" "),n("p",[n("strong",[t._v("disable display ")])]),t._v(" "),n("p",[n("strong",[t._v("enable display ")])]),t._v(" "),n("p",[t._v("disable和enalbe不删除自动显示的设置,而只是让其失效和恢复。")]),t._v(" "),n("p",[n("strong",[t._v("info display")])]),t._v(" "),n("p",[t._v("查看display设置的自动显示的信息,包括设置的编号,表达式,是否enable。")]),t._v(" "),n("h2",{attrs:{id:"_4-2-示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_4-2-示例"}},[t._v("#")]),t._v(" 4.2 示例")]),t._v(" "),n("p",[t._v("源代码test2.c同上")]),t._v(" "),n("h3",{attrs:{id:"_4-2-1-调试过程"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_4-2-1-调试过程"}},[t._v("#")]),t._v(" 4.2.1 调试过程")]),t._v(" "),n("p",[t._v("启动GDB:")]),t._v(" "),n("p",[n("em",[t._v("root@luo:~/workspace/test/exec\\>gdb -q test2")])]),t._v(" "),n("p",[n("em",[t._v("Reading symbols from /home/luo/workspace/test/exec/test2...done.")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) l 1 --------------")]),t._v(" 列出源代码")]),t._v(" "),n("p",[n("em",[t._v("1 #include ")])]),t._v(" "),n("p",[n("em",[t._v("2")])]),t._v(" "),n("p",[n("em",[t._v("3 int func(int m){")])]),t._v(" "),n("p",[n("em",[t._v("4 int n = 0;")])]),t._v(" "),n("p",[n("em",[t._v("5 int i = 0;")])]),t._v(" "),n("p",[n("em",[t._v("6 for(i = 0; i < m; i++){")])]),t._v(" "),n("p",[n("em",[t._v("7 n += m;")])]),t._v(" "),n("p",[n("em",[t._v("8 }")])]),t._v(" "),n("p",[n("em",[t._v("9")])]),t._v(" "),n("p",[n("em",[t._v("10 return n;")])]),t._v(" "),n("p",[n("em",[t._v("(gdb)")])]),t._v(" "),n("p",[n("em",[t._v("11")])]),t._v(" "),n("p",[n("em",[t._v("12 }")])]),t._v(" "),n("p",[n("em",[t._v("13")])]),t._v(" "),n("p",[n("em",[t._v("14 int main(){")])]),t._v(" "),n("p",[n("em",[t._v("15 int i = 0;")])]),t._v(" "),n("p",[n("em",[t._v("16 int b = 0;")])]),t._v(" "),n("p",[n("em",[t._v("17 int n = 20;")])]),t._v(" "),n("p",[n("em",[t._v("18 int sum = 0;")])]),t._v(" "),n("p",[n("em",[t._v("19 sum = func(40);")])]),t._v(" "),n("p",[n("em",[t._v("20 for(i = 0; i < 10; i++){")])]),t._v(" "),n("p",[n("em",[t._v("(gdb)")])]),t._v(" "),n("p",[n("em",[t._v("21 n++;")])]),t._v(" "),n("p",[n("em",[t._v("22 }")])]),t._v(" "),n("p",[n("em",[t._v("23")])]),t._v(" "),n("p",[n("em",[t._v("24 return 0;")])]),t._v(" "),n("p",[n("em",[t._v("25 }")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) break 21 --------------")]),t._v(" 设置断点,在21行")]),t._v(" "),n("p",[n("em",[t._v("Breakpoint 1 at 0x40055f: file test2.c, line 21.")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) r --------------")]),t._v(" 运行程序")]),t._v(" "),n("p",[n("em",[t._v("Starting program: /home/luo/workspace/test/exec/test2")])]),t._v(" "),n("p",[n("em",[t._v("Breakpoint 1, main () at test2.c:21")])]),t._v(" "),n("p",[n("em",[t._v("21 n++;")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) display n --------------")]),t._v(" 跟踪变量"),n("em",[t._v("n")]),t._v("的值")]),t._v(" "),n("p",[n("em",[t._v("1: n = 20")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) display i --------------")]),t._v(" 跟踪变量"),n("em",[t._v("i")]),t._v("的值")]),t._v(" "),n("p",[n("em",[t._v("2: i = 0")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) display n+i --------------")]),t._v(" 跟踪"),n("em",[t._v("n+i")]),t._v("的值")]),t._v(" "),n("p",[n("em",[t._v("3: n+i = 20")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) display/x n --------------")]),t._v(" 跟踪"),n("em",[t._v("n")]),t._v("的值,以16进制显示")]),t._v(" "),n("p",[n("em",[t._v("4: /x n = 0x14")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) display &n --------------")]),t._v(" 跟踪"),n("em",[t._v("n")]),t._v("的地址")]),t._v(" "),n("p",[n("em",[t._v("5: &n = (int *) 0x7fffffffe0a8")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) c --------------")]),t._v(" 继续运行程序")]),t._v(" "),n("p",[n("em",[t._v("Continuing.")])]),t._v(" "),n("p",[n("em",[t._v("Breakpoint 1, main () at test2.c:21")])]),t._v(" "),n("p",[n("em",[t._v("21 n++;")])]),t._v(" "),n("p",[n("em",[t._v("5: &n = (int *) 0x7fffffffe0a8")])]),t._v(" "),n("p",[n("em",[t._v("4: /x n = 0x15")])]),t._v(" "),n("p",[n("em",[t._v("3: n+i = 22")])]),t._v(" "),n("p",[n("em",[t._v("2: i = 1")])]),t._v(" "),n("p",[n("em",[t._v("1: n = 21")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) delete display 4 --------------")]),t._v(" 删除4号跟踪")]),t._v(" "),n("p",[n("em",[t._v("(gdb) c --------------")]),t._v(" 继续运行程序")]),t._v(" "),n("p",[n("em",[t._v("Continuing.")])]),t._v(" "),n("p",[n("em",[t._v("Breakpoint 1, main () at test2.c:21 ------------")]),t._v(" 可以看到,4号没了")]),t._v(" "),n("p",[n("em",[t._v("21 n++;")])]),t._v(" "),n("p",[n("em",[t._v("5: &n = (int *) 0x7fffffffe0a8")])]),t._v(" "),n("p",[n("em",[t._v("3: n+i = 24")])]),t._v(" "),n("p",[n("em",[t._v("2: i = 2")])]),t._v(" "),n("p",[n("em",[t._v("1: n = 22")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) disable display 5 --------------")]),t._v(" 使5号跟踪失效")]),t._v(" "),n("p",[n("em",[t._v("(gdb) c --------------")]),t._v(" 继续运行程序")]),t._v(" "),n("p",[n("em",[t._v("Continuing.")])]),t._v(" "),n("p",[n("em",[t._v("Breakpoint 1, main () at test2.c:21 -------")]),t._v(" 可以看到,5号也没显示")]),t._v(" "),n("p",[n("em",[t._v("21 n++;")])]),t._v(" "),n("p",[n("em",[t._v("3: n+i = 26")])]),t._v(" "),n("p",[n("em",[t._v("2: i = 3")])]),t._v(" "),n("p",[n("em",[t._v("1: n = 23")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) enable display 5 --------------")]),t._v(" 使5号跟踪恢复")]),t._v(" "),n("p",[n("em",[t._v("(gdb) c --------------")]),t._v(" 继续运行程序")]),t._v(" "),n("p",[n("em",[t._v("Continuing.")])]),t._v(" "),n("p",[n("em",[t._v("Breakpoint 1, main () at test2.c:21 ------")]),t._v(" 可以看到,5号再次显示")]),t._v(" "),n("p",[n("em",[t._v("21 n++;")])]),t._v(" "),n("p",[n("em",[t._v("5: &n = (int *) 0x7fffffffe0a8")])]),t._v(" "),n("p",[n("em",[t._v("3: n+i = 28")])]),t._v(" "),n("p",[n("em",[t._v("2: i = 4")])]),t._v(" "),n("p",[n("em",[t._v("1: n = 24")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) info display --------------")]),t._v(" 查看自动显示信息")]),t._v(" "),n("p",[n("em",[t._v("Auto-display expressions now in effect:")])]),t._v(" "),n("p",[n("em",[t._v("Num Enb Expression")])]),t._v(" "),n("p",[n("em",[t._v("5: y &n")])]),t._v(" "),n("p",[n("em",[t._v("3: y n+i")])]),t._v(" "),n("p",[n("em",[t._v("2: y i")])]),t._v(" "),n("p",[n("em",[t._v("1: y n")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) disable display 1 2 3 -----------")]),t._v(" 使1,2,3号都失效")]),t._v(" "),n("p",[n("em",[t._v("(gdb) c --------------")]),t._v(" 继续运行程序")]),t._v(" "),n("p",[n("em",[t._v("Continuing.")])]),t._v(" "),n("p",[n("em",[t._v("Breakpoint 1, main () at test2.c:21")])]),t._v(" "),n("p",[n("em",[t._v("21 n++;")])]),t._v(" "),n("p",[n("em",[t._v("5: &n = (int *) 0x7fffffffe0a8")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) info display --------------")]),t._v(" 查看自动显示信息")]),t._v(" "),n("p",[n("em",[t._v("Auto-display expressions now in effect:")])]),t._v(" "),n("p",[n("em",[t._v("Num Enb Expression")])]),t._v(" "),n("p",[n("em",[t._v("5: y &n")])]),t._v(" "),n("p",[n("em",[t._v("3: n n+i")])]),t._v(" "),n("p",[n("em",[t._v("2: n i")])]),t._v(" "),n("p",[n("em",[t._v("1: n n")])]),t._v(" "),n("p",[n("em",[t._v("(gdb)")])]),t._v(" "),n("ul",[n("li"),t._v(" "),n("li")]),t._v(" "),n("h1",{attrs:{id:"_5-显示-修改寄存器"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_5-显示-修改寄存器"}},[t._v("#")]),t._v(" 5 显示/修改寄存器")]),t._v(" "),n("h2",{attrs:{id:"_5-1-背景知识"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_5-1-背景知识"}},[t._v("#")]),t._v(" 5.1 背景知识")]),t._v(" "),n("p",[t._v("先明确一点,这里指的是通用寄存器(后简称寄存器)。既然是通用的,使用并没有限制;后面介绍寄存器使用规则或者惯例,只是GCC/G++的规则。因为我们想对GCC编译的C/C++序进行分析,所以了解这些规则就很有帮助。")]),t._v(" "),n("p",[t._v("在体系结构教科书中,寄存器通常被说成寄存器文件,其实就是CPU上的一块存储区域,不过更喜欢使用标识符来表示,而不是地址而已。")]),t._v(" "),n("p",[t._v("X86-64中,所有寄存器都是64位,相对32位的x86来说,标识符发生了变化,比如:从原来的%ebp变成了%rbp。为了向后兼容性,%ebp依然可以使用,不过指向了%rbp的低32位。")]),t._v(" "),n("p",[t._v("X86-64寄存器的变化,不仅体现在位数上,更加体现在寄存器数量上。新增加寄存器%r8到%r15。加上x86的原有8个,一共16个寄存器。")]),t._v(" "),n("p",[t._v("刚刚说到,寄存器集成在CPU上,存取速度比存储器快好几个数量级,寄存器多了,GCC就可以更多的使用寄存器,替换之前的存储器堆栈使用,从而大大提升性能。")]),t._v(" "),n("p",[t._v("让寄存器为己所用,就得了解它们的用途,这些用途都涉及函数调用,X86-64有16个64位寄存器,分别是:")]),t._v(" "),n("p",[t._v("%rax,%rbx,%rcx,%rdx,%rsi,%rdi,%rbp,%rsp,%r8,%r9,%r10,%r11,%r12,%r13,%r14,%r15。")]),t._v(" "),n("p",[t._v("其中:")]),t._v(" "),n("p",[t._v("%rax 作为函数返回值使用。")]),t._v(" "),n("p",[t._v("%rsp 栈指针寄存器,指向栈顶。")]),t._v(" "),n("p",[t._v("%rdi,%rsi,%rdx,%rcx,%r8,%r9 用作函数参数,依次对应第1参数,第2参数…")]),t._v(" "),n("p",[t._v("%rbx,%rbp,%r12,%r13,%14,%15 用作数据存储,遵循被调用者使用规则,简单说就是随便用,调用子函数之前要备份它,以防他被修改。")]),t._v(" "),n("p",[t._v("%r10,%r11 用作数据存储,遵循调用者使用规则,简单说就是使用之前要先保存原值。")]),t._v(" "),n("p",[n("img",{attrs:{src:"media/1e797b88a9a47d8bf638b1897e086c27.png",alt:""}})]),t._v(" "),n("h2",{attrs:{id:"_5-2-使用命令"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_5-2-使用命令"}},[t._v("#")]),t._v(" 5.2 使用命令")]),t._v(" "),n("p",[n("strong",[t._v("info registers")])]),t._v(" "),n("p",[t._v("查看寄存器的情况。(不包括浮点寄存器)")]),t._v(" "),n("p",[n("strong",[t._v("info all-registers")])]),t._v(" "),n("p",[t._v("查看所有寄存器的情况。(包括浮点寄存器)")]),t._v(" "),n("p",[n("strong",[t._v("info registers ")])]),t._v(" "),n("p",[t._v("查看所指定的寄存器的情况。")]),t._v(" "),n("p",[n("strong",[t._v("set $=")])]),t._v(" "),n("p",[t._v("修改寄存器的值。")]),t._v(" "),n("h2",{attrs:{id:"_5-3-示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_5-3-示例"}},[t._v("#")]),t._v(" 5.3 示例")]),t._v(" "),n("p",[t._v("源代码test2.c同上")]),t._v(" "),n("h3",{attrs:{id:"_5-2-1-调试过程"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_5-2-1-调试过程"}},[t._v("#")]),t._v(" 5.2.1 调试过程")]),t._v(" "),n("p",[t._v("启动GDB:")]),t._v(" "),n("p",[n("em",[t._v("root@luo:~/workspace/test/exec\\>gdb -q test2")])]),t._v(" "),n("p",[n("em",[t._v("Reading symbols from /home/luo/workspace/test/exec/test2...done.")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) b main --------------")]),t._v(" 在main函数设置断点")]),t._v(" "),n("p",[n("em",[t._v("Breakpoint 1 at 0x40052d: file test2.c, line 15.")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) r --------------")]),t._v(" 运行程序")]),t._v(" "),n("p",[n("em",[t._v("Starting program: /home/luo/workspace/test/exec/test2")])]),t._v(" "),n("p",[n("em",[t._v("Breakpoint 1, main () at test2.c:15")])]),t._v(" "),n("p",[n("em",[t._v("15 int i = 0;")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) s --------------")]),t._v(" step单步执行")]),t._v(" "),n("p",[n("em",[t._v("16 int b = 0;")])]),t._v(" "),n("p",[n("em",[t._v("(gdb)")])]),t._v(" "),n("p",[n("em",[t._v("17 int n = 20;")])]),t._v(" "),n("p",[n("em",[t._v("(gdb)")])]),t._v(" "),n("p",[n("em",[t._v("18 int sum = 0;")])]),t._v(" "),n("p",[n("em",[t._v("(gdb)")])]),t._v(" "),n("p",[n("em",[t._v("19 sum = func(40);")])]),t._v(" "),n("p",[n("em",[t._v("(gdb)")])]),t._v(" "),n("p",[n("em",[t._v("func (m=40) at test2.c:4 --------------")]),t._v(" 进入*func()*函数了")]),t._v(" "),n("p",[n("em",[t._v("4 int n = 0;")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) i all-r --------------")]),t._v(" 显示所有寄存器信息")]),t._v(" "),n("p",[n("em",[t._v("rax 0x400525 4195621")])]),t._v(" "),n("p",[n("em",[t._v("rbx 0x0 0")])]),t._v(" "),n("p",[n("em",[t._v("rcx 0x0 0")])]),t._v(" "),n("p",[n("em",[t._v("rdx 0x7fffffffe1a8 140737488347560")])]),t._v(" "),n("p",[n("em",[t._v("rsi 0x7fffffffe198 140737488347544")])]),t._v(" "),n("p",[n("em",[t._v("rdi 0x28 40")])]),t._v(" "),n("p",[n("em",[t._v("rbp 0x7fffffffe090 0x7fffffffe090")])]),t._v(" "),n("p",[n("em",[t._v("rsp 0x7fffffffe090 0x7fffffffe090")])]),t._v(" "),n("p",[n("em",[t._v("r8 0x30555a3c60 207590407264")])]),t._v(" "),n("p",[n("em",[t._v("r9 0x305360ec80 207557291136")])]),t._v(" "),n("p",[n("em",[t._v("r10 0x7fffffffdf40 140737488346944")])]),t._v(" "),n("p",[n("em",[t._v("r11 0x3055221b00 207586728704")])]),t._v(" "),n("p",[n("em",[t._v("r12 0x4003b0 4195248")])]),t._v(" "),n("p",[n("em",[t._v("r13 0x7fffffffe190 140737488347536")])]),t._v(" "),n("p",[n("em",[t._v("r14 0x0 0")])]),t._v(" "),n("p",[n("em",[t._v("r15 0x0 0")])]),t._v(" "),n("p",[n("em",[t._v("rip 0x4004f7 0x4004f7 ")])]),t._v(" "),n("p",[n("em",[t._v("eflags 0x206 [ PF IF ]")])]),t._v(" "),n("p",[n("em",[t._v("cs 0x33 51")])]),t._v(" "),n("p",[n("em",[t._v("ss 0x2b 43")])]),t._v(" "),n("p",[n("em",[t._v("ds 0x0 0")])]),t._v(" "),n("p",[n("em",[t._v("es 0x0 0")])]),t._v(" "),n("p",[n("em",[t._v("fs 0x0 0")])]),t._v(" "),n("p",[n("em",[t._v("gs 0x0 0")])]),t._v(" "),n("p",[n("em",[t._v("st0 0 (raw 0x00000000000000000000)")])]),t._v(" "),n("p",[n("em",[t._v("st1 0 (raw 0x00000000000000000000)")])]),t._v(" "),n("p",[n("em",[t._v("---Type to continue, or q to quit---q")])]),t._v(" "),n("p",[n("em",[t._v("Quit --------------")]),t._v(" 退出显示")]),t._v(" "),n("p",[n("em",[t._v("(gdb) i r --------------")]),t._v(" 显示寄存器信息,不包括浮点寄存器")]),t._v(" "),n("p",[n("em",[t._v("rax 0x400525 4195621")])]),t._v(" "),n("p",[n("em",[t._v("rbx 0x0 0")])]),t._v(" "),n("p",[n("em",[t._v("rcx 0x0 0")])]),t._v(" "),n("p",[n("em",[t._v("rdx 0x7fffffffe1a8 140737488347560")])]),t._v(" "),n("p",[n("em",[t._v("rsi 0x7fffffffe198 140737488347544")])]),t._v(" "),n("p",[n("em",[t._v("rdi 0x28 40")])]),t._v(" "),n("p",[n("em",[t._v("rbp 0x7fffffffe090 0x7fffffffe090")])]),t._v(" "),n("p",[n("em",[t._v("rsp 0x7fffffffe090 0x7fffffffe090")])]),t._v(" "),n("p",[n("em",[t._v("r8 0x30555a3c60 207590407264")])]),t._v(" "),n("p",[n("em",[t._v("r9 0x305360ec80 207557291136")])]),t._v(" "),n("p",[n("em",[t._v("r10 0x7fffffffdf40 140737488346944")])]),t._v(" "),n("p",[n("em",[t._v("r11 0x3055221b00 207586728704")])]),t._v(" "),n("p",[n("em",[t._v("r12 0x4003b0 4195248")])]),t._v(" "),n("p",[n("em",[t._v("r13 0x7fffffffe190 140737488347536")])]),t._v(" "),n("p",[n("em",[t._v("r14 0x0 0")])]),t._v(" "),n("p",[n("em",[t._v("r15 0x0 0")])]),t._v(" "),n("p",[n("em",[t._v("rip 0x4004f7 0x4004f7 ")])]),t._v(" "),n("p",[n("em",[t._v("eflags 0x206 [ PF IF ]")])]),t._v(" "),n("p",[n("em",[t._v("cs 0x33 51")])]),t._v(" "),n("p",[n("em",[t._v("ss 0x2b 43")])]),t._v(" "),n("p",[n("em",[t._v("ds 0x0 0")])]),t._v(" "),n("p",[n("em",[t._v("es 0x0 0")])]),t._v(" "),n("p",[n("em",[t._v("fs 0x0 0")])]),t._v(" "),n("p",[n("em",[t._v("gs 0x0 0")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) info registers rax --------------")]),t._v(" 查看指定寄存器的信息")]),t._v(" "),n("p",[n("em",[t._v("rax 0x400525 4195621")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) n --------------")]),t._v(" 单步执行")]),t._v(" "),n("p",[n("em",[t._v("5 int i = 0;")])]),t._v(" "),n("p",[n("em",[t._v("(gdb)")])]),t._v(" "),n("p",[n("em",[t._v("6 for(i = 0; i < m; i++){")])]),t._v(" "),n("p",[n("em",[t._v("(gdb)")])]),t._v(" "),n("p",[n("em",[t._v("7 n += m;")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) u --------------")]),t._v(" 执行直至循环结束")]),t._v(" "),n("p",[n("em",[t._v("6 for(i = 0; i < m; i++){")])]),t._v(" "),n("p",[n("em",[t._v("(gdb)")])]),t._v(" "),n("p",[n("em",[t._v("10 return n;")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) i r rax --------------")]),t._v(" 查看指定寄存器"),n("em",[t._v("rax")]),t._v("信息,其存放函数返回值")]),t._v(" "),n("p",[n("em",[t._v("rax 0x28 40")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) n --------------")]),t._v(" 单步执行,此时已经return")]),t._v(" "),n("p",[n("em",[t._v("12 }")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) i r rax --------------")]),t._v(" 查看"),n("em",[t._v("rax")]),t._v("信息,为1600")]),t._v(" "),n("p",[n("em",[t._v("rax 0x640 1600")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) set $rax=99 --------------")]),t._v(" 将"),n("em",[t._v("rax")]),t._v("值修改为99")]),t._v(" "),n("p",[n("em",[t._v("(gdb) i r rax --------------")]),t._v(" 再查看"),n("em",[t._v("rax")]),t._v(",为99")]),t._v(" "),n("p",[n("em",[t._v("rax 0x63 99")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) n --------------")]),t._v(" 单步执行,此时已经退出函数")]),t._v(" "),n("p",[n("em",[t._v("main () at test2.c:20")])]),t._v(" "),n("p",[n("em",[t._v("20 for(i = 0; i < 10; i++){")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) p sum -----------")]),t._v(" 显示sum值,其值应为刚刚*func()*函数的返回值")]),t._v(" "),n("p",[n("em",[t._v("$1 = 99 -----------")]),t._v(" 正确")]),t._v(" "),n("p",[n("em",[t._v("(gdb)")])]),t._v(" "),n("h1",{attrs:{id:"_6-查看程序的堆栈"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_6-查看程序的堆栈"}},[t._v("#")]),t._v(" 6 查看程序的堆栈")]),t._v(" "),n("h2",{attrs:{id:"_6-1-背景知识"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_6-1-背景知识"}},[t._v("#")]),t._v(" 6.1 背景知识")]),t._v(" "),n("p",[t._v("当你的程序到暂停到断点处时,你需要知道的第一件事就是知道程序停在哪儿,以及通过什么样的函数调用关系到达这里的。")]),t._v(" "),n("p",[t._v("每当你的程序调用一个函数,这个函数的相关信息将会生成,该信息包括这个函数在程序中的位置,函数的参数,以及被调用的局部变量的值。这些信息保存在一个数据块中,这个数据块叫做栈框。这些栈框位于内存中称为栈的区域。")]),t._v(" "),n("p",[t._v("当你的程序断点处停止,GDB查看堆栈的命令允许你看到所有函数相关的信息。")]),t._v(" "),n("p",[t._v("栈被划分为多个连续的块,每个块称为栈框;每个栈框都存有与调用函数相关的数据。栈框中包含了调用函数的参数,调用函数的局部变量。以及这个函数的执行的地址。")]),t._v(" "),n("p",[t._v("当程序开始执行时,栈上就只有一个栈框,也就是用来描述Main函数的。这个栈框称为初始化栈框或最外层栈框。每当调用一个函数,一个新的栈框将会生成。每当一个函数结束,该函数对应的栈框将会消除。如果一个函数是递归函数,这将会对同一个函数产生很多个栈框。正在执行函数的栈框将叫做最内层栈框。这个是所有存在栈框中最新创建的。在你的程序里,栈框通过它对应到的地址进行标识。一个栈框由多个字节组成,每个栈框都有自己的地址,当程序执行到这个栈框时。通常这个栈框地址存放在特定的寄存器中。")]),t._v(" "),n("p",[t._v("gdb为每个存在的栈框赋上一个标号。标号从0开始,0表示最里层的栈框。也就是正在被调用函数的栈框。这些标号在程序中并不存在,它是由gdb赋予的,gdb通过赋予这个标号来给gdb的命令指定哪个栈框。")]),t._v(" "),n("h2",{attrs:{id:"_6-2-使用命令"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_6-2-使用命令"}},[t._v("#")]),t._v(" 6.2 使用命令")]),t._v(" "),n("p",[n("strong",[t._v("frame args")])]),t._v(" "),n("p",[t._v("这个frame命令允许你从一个栈框移动到另一个栈框,然后可以打印出你选择的栈框,args要么是栈框的地址,要么是栈框的标号,如果没有参数,frame命令将会打印出当前的栈框。")]),t._v(" "),n("p",[n("strong",[t._v("select -frame")])]),t._v(" "),n("p",[t._v("select -frame命令允许你从一个栈框移动到另外一个栈框而不打印栈框的信息,这个命令可以看作是frame命令的silent版本。")]),t._v(" "),n("p",[n("strong",[t._v("backtrace")])]),t._v(" "),n("p",[n("strong",[t._v("bt")])]),t._v(" "),n("p",[t._v("bt命令打印栈全部的backtrace,每个栈框显示一行。你可以在任何时间结束backtrace通过键入系统中断字符,ctrl+c。")]),t._v(" "),n("p",[n("strong",[t._v("backtrace n")])]),t._v(" "),n("p",[n("strong",[t._v("bt n")])]),t._v(" "),n("p",[t._v("bt n 命令将会显示最内层的n个栈框。")]),t._v(" "),n("p",[n("strong",[t._v("backtrace -n")])]),t._v(" "),n("p",[n("strong",[t._v("bt -n")])]),t._v(" "),n("p",[t._v("bt -n将会显示最外层的n个栈框。")]),t._v(" "),n("p",[n("strong",[t._v("backtrace full")])]),t._v(" "),n("p",[n("strong",[t._v("bt full")])]),t._v(" "),n("p",[n("strong",[t._v("bt full n")])]),t._v(" "),n("p",[n("strong",[t._v("bt full -n")])]),t._v(" "),n("p",[t._v("如果添加full这个参数的话,将会显示栈框中的局部变量。")]),t._v(" "),n("p",[n("strong",[t._v("frame n")])]),t._v(" "),n("p",[n("strong",[t._v("f n")])]),t._v(" "),n("p",[t._v("frame n(f n)将会选择栈框n,栈框0是最内层的栈框,也就是当前执行的函数,栈框1是调用最内层栈框的函数。最大的栈框就是main函数对应的栈框。")]),t._v(" "),n("p",[n("strong",[t._v("frame addr")])]),t._v(" "),n("p",[n("strong",[t._v("f addr")])]),t._v(" "),n("p",[t._v("通过栈框的地址选择栈框。如果栈框被bug破坏掉了,这将是主要的方法去查看栈框。栈框破坏掉了,gdb将不能通过栈框标号去定位栈框。另外,如果你的程序有多个栈,在多个栈切换时这中方法将很有用。")]),t._v(" "),n("p",[n("strong",[t._v("up n")])]),t._v(" "),n("p",[t._v("up n将会朝外层栈框走n个。它的方向是朝最外层的栈框,也就是最大的栈框号。")]),t._v(" "),n("p",[n("strong",[t._v("down n")])]),t._v(" "),n("p",[t._v("down n和up n是对应的,它将会朝最内层走n个栈框。")]),t._v(" "),n("p",[t._v("这些命令将会打印两行关于该栈框的信息,第一行将会显示栈框号,函数名,参数,以及源代码所在的文件名,和所在的行。")]),t._v(" "),n("h2",{attrs:{id:"_6-3-示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_6-3-示例"}},[t._v("#")]),t._v(" 6.3 示例")]),t._v(" "),n("h3",{attrs:{id:"_6-3-1-源代码test3-c"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_6-3-1-源代码test3-c"}},[t._v("#")]),t._v(" 6.3.1 源代码test3.c")]),t._v(" "),n("ol",[n("li",[t._v("#include ")]),t._v(" "),n("li"),t._v(" "),n("li",[n("strong",[t._v("int")]),t._v(" func4("),n("strong",[t._v("int")]),t._v(" m)")]),t._v(" "),n("li",[t._v("{")]),t._v(" "),n("li",[n("strong",[t._v("int")]),t._v(" ret = m - m / 2;")]),t._v(" "),n("li",[n("strong",[t._v("return")]),t._v(" ret;")]),t._v(" "),n("li",[t._v("}")]),t._v(" "),n("li"),t._v(" "),n("li",[n("strong",[t._v("int")]),t._v(" func3("),n("strong",[t._v("int")]),t._v(" m)")]),t._v(" "),n("li",[t._v("{")]),t._v(" "),n("li",[n("strong",[t._v("int")]),t._v(" ret = m + func4(m);")]),t._v(" "),n("li",[n("strong",[t._v("return")]),t._v(" ret;")]),t._v(" "),n("li",[t._v("}")]),t._v(" "),n("li"),t._v(" "),n("li"),t._v(" "),n("li",[n("strong",[t._v("int")]),t._v(" func2("),n("strong",[t._v("int")]),t._v(" m)")]),t._v(" "),n("li",[t._v("{")]),t._v(" "),n("li",[n("strong",[t._v("int")]),t._v(" ret = m * func3(m);")]),t._v(" "),n("li",[n("strong",[t._v("return")]),t._v(" ret;")]),t._v(" "),n("li",[t._v("}")]),t._v(" "),n("li"),t._v(" "),n("li",[n("strong",[t._v("int")]),t._v(" func1("),n("strong",[t._v("int")]),t._v(" m)")]),t._v(" "),n("li",[t._v("{")]),t._v(" "),n("li",[n("strong",[t._v("int")]),t._v(" ret = func2(m) + 1;")]),t._v(" "),n("li",[n("strong",[t._v("return")]),t._v(" ret;")]),t._v(" "),n("li",[t._v("}")]),t._v(" "),n("li"),t._v(" "),n("li",[n("strong",[t._v("int")]),t._v(" main()")]),t._v(" "),n("li",[t._v("{")]),t._v(" "),n("li",[n("strong",[t._v("int")]),t._v(" m = 40;")]),t._v(" "),n("li",[n("strong",[t._v("int")]),t._v(" n = func1(m);")]),t._v(" "),n("li"),t._v(" "),n("li",[n("strong",[t._v("return")]),t._v(" 0;")]),t._v(" "),n("li",[t._v("}")]),t._v(" "),n("li")]),t._v(" "),n("h3",{attrs:{id:"_6-3-2-调试过程"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_6-3-2-调试过程"}},[t._v("#")]),t._v(" 6.3.2 调试过程")]),t._v(" "),n("p",[t._v("启动GDB:")]),t._v(" "),n("p",[n("em",[t._v("root@luo:~/workspace/test/exec\\>gdb -q test3")])]),t._v(" "),n("p",[n("em",[t._v("Reading symbols from /home/luo/workspace/test/exec/test3...done.")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) b main --------------")]),t._v(" 在main函数设置断点")]),t._v(" "),n("p",[n("em",[t._v("Breakpoint 1 at 0x40057d: file ../source/test3.c, line 30.")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) r --------------")]),t._v(" 运行程序")]),t._v(" "),n("p",[n("em",[t._v("Starting program: /home/luo/workspace/test/exec/test3")])]),t._v(" "),n("p",[n("em",[t._v("Breakpoint 1, main () at ../source/test3.c:30")])]),t._v(" "),n("p",[n("em",[t._v("30 int m = 40;")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) s --------------")]),t._v(" step单步执行")]),t._v(" "),n("p",[n("em",[t._v("31 int n = func1(m);")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) s")])]),t._v(" "),n("p",[n("em",[t._v("func1 (m=40) at ../source/test3.c:24")])]),t._v(" "),n("p",[n("em",[t._v("24 int ret = func2(m) + 1;")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) s")])]),t._v(" "),n("p",[n("em",[t._v("func2 (m=40) at ../source/test3.c:18")])]),t._v(" "),n("p",[n("em",[t._v("18 int ret = m * func3(m);")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) s")])]),t._v(" "),n("p",[n("em",[t._v("func3 (m=40) at ../source/test3.c:11")])]),t._v(" "),n("p",[n("em",[t._v("11 int ret = m + func4(m);")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) s")])]),t._v(" "),n("p",[n("em",[t._v("func4 (m=40) at ../source/test3.c:5")])]),t._v(" "),n("p",[n("em",[t._v("5 int ret = m - m / 2;")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) bt --------------")]),t._v(" 显示栈信息")]),t._v(" "),n("p",[n("em",[t._v("#0 func4 (m=40) at ../source/test3.c:5")])]),t._v(" "),n("p",[n("em",[t._v("#1 0x0000000000400527 in func3 (m=40) at ../source/test3.c:11")])]),t._v(" "),n("p",[n("em",[t._v("#2 0x0000000000400549 in func2 (m=40) at ../source/test3.c:18")])]),t._v(" "),n("p",[n("em",[t._v("#3 0x000000000040056a in func1 (m=40) at ../source/test3.c:24")])]),t._v(" "),n("p",[n("em",[t._v("#4 0x000000000040058e in main () at ../source/test3.c:31")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) frame 2 --------------")]),t._v(" 跳到标号为2的栈框")]),t._v(" "),n("p",[n("em",[t._v("#2 0x0000000000400549 in func2 (m=40) at ../source/test3.c:18")])]),t._v(" "),n("p",[n("em",[t._v("18 int ret = m * func3(m);")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) select-frame 2 -------------")]),t._v(" 跳到标号为2的栈框并且不打印信息")]),t._v(" "),n("p",[n("em",[t._v("(gdb) bt 3 --------------")]),t._v(" 显示最内层的3个栈框")]),t._v(" "),n("p",[n("em",[t._v("#0 func4 (m=40) at ../source/test3.c:5")])]),t._v(" "),n("p",[n("em",[t._v("#1 0x0000000000400527 in func3 (m=40) at ../source/test3.c:11")])]),t._v(" "),n("p",[n("em",[t._v("#2 0x0000000000400549 in func2 (m=40) at ../source/test3.c:18")])]),t._v(" "),n("p",[n("em",[t._v("(More stack frames follow...)")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) bt -3 --------------")]),t._v(" 显示最外层的3个栈框")]),t._v(" "),n("p",[n("em",[t._v("#2 0x0000000000400549 in func2 (m=40) at ../source/test3.c:18")])]),t._v(" "),n("p",[n("em",[t._v("#3 0x000000000040056a in func1 (m=40) at ../source/test3.c:24")])]),t._v(" "),n("p",[n("em",[t._v("#4 0x000000000040058e in main () at ../source/test3.c:31")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) bt full --------------")]),t._v(" 显示栈信息,包括局部变量")]),t._v(" "),n("p",[n("em",[t._v("#0 func4 (m=40) at ../source/test3.c:5")])]),t._v(" "),n("p",[n("em",[t._v("ret = 0")])]),t._v(" "),n("p",[n("em",[t._v("#1 0x0000000000400527 in func3 (m=40) at ../source/test3.c:11")])]),t._v(" "),n("p",[n("em",[t._v("ret = 0")])]),t._v(" "),n("p",[n("em",[t._v("#2 0x0000000000400549 in func2 (m=40) at ../source/test3.c:18")])]),t._v(" "),n("p",[n("em",[t._v("ret = 0")])]),t._v(" "),n("p",[n("em",[t._v("#3 0x000000000040056a in func1 (m=40) at ../source/test3.c:24")])]),t._v(" "),n("p",[n("em",[t._v("ret = 0")])]),t._v(" "),n("p",[n("em",[t._v("#4 0x000000000040058e in main () at ../source/test3.c:31")])]),t._v(" "),n("p",[n("em",[t._v("m = 40")])]),t._v(" "),n("p",[n("em",[t._v("n = 0")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) frame 2")]),t._v(" "),n("em",[t._v("--------------")]),t._v(" 移动到标号为2的栈框")]),t._v(" "),n("p",[n("em",[t._v("#2 0x0000000000400549 in func2 (m=40) at ../source/test3.c:18")])]),t._v(" "),n("p",[n("em",[t._v("18 int ret = m * func3(m);")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) bt")])]),t._v(" "),n("p",[n("em",[t._v("#0 func4 (m=40) at ../source/test3.c:5")])]),t._v(" "),n("p",[n("em",[t._v("#1 0x0000000000400527 in func3 (m=40) at ../source/test3.c:11")])]),t._v(" "),n("p",[n("em",[t._v("#2 0x0000000000400549 in func2 (m=40) at ../source/test3.c:18")])]),t._v(" "),n("p",[n("em",[t._v("#3 0x000000000040056a in func1 (m=40) at ../source/test3.c:24")])]),t._v(" "),n("p",[n("em",[t._v("#4 0x000000000040058e in main () at ../source/test3.c:31")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) up 2 --------------")]),t._v(" 向外层栈框移动2层")]),t._v(" "),n("p",[n("em",[t._v("#4 0x000000000040058e in main () at ../source/test3.c:31")])]),t._v(" "),n("p",[n("em",[t._v("31 int n = func1(m);")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) down 3 --------------")]),t._v(" 向内层栈框移动3层")]),t._v(" "),n("p",[n("em",[t._v("#1 0x0000000000400527 in func3 (m=40) at ../source/test3.c:11")])]),t._v(" "),n("p",[n("em",[t._v("11 int ret = m + func4(m);")])]),t._v(" "),n("p",[n("em",[t._v("(gdb)")])]),t._v(" "),n("h1",{attrs:{id:"_7-多线程调试"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_7-多线程调试"}},[t._v("#")]),t._v(" 7 多线程调试")]),t._v(" "),n("h2",{attrs:{id:"_7-1-使用命令"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_7-1-使用命令"}},[t._v("#")]),t._v(" 7.1 使用命令")]),t._v(" "),n("p",[n("strong",[t._v("info threads")])]),t._v(" "),n("p",[t._v("查看当前进程的线程。GDB会为每个线程分配一个ID, 后面操作线程的时候会用到这个ID。前面有*的是当前调试的线程。")]),t._v(" "),n("p",[n("strong",[t._v("thread ")])]),t._v(" "),n("p",[t._v("切换调试的线程为指定ID的线程。")]),t._v(" "),n("p",[n("strong",[t._v("break file.c:number thread all")])]),t._v(" "),n("p",[t._v("在file.c文件第number行处为所有经过这里的线程设置断点。")]),t._v(" "),n("p",[n("strong",[t._v("set scheduler-locking off|on|step")])]),t._v(" "),n("p",[t._v("在使用step或者continue命令调试当前被调试线程的时候,其他线程也是同时执行的, 怎么只让被调试程序执行呢?")]),t._v(" "),n("p",[t._v("通过这个命令就可以实现这个需求。")]),t._v(" "),n("p",[t._v("off 不锁定任何线程,也就是所有线程都执行,这是默认值。")]),t._v(" "),n("p",[t._v("on 只有当前被调试程序会执行。")]),t._v(" "),n("p",[t._v("step 在单步的时候,除了next过一个函数的情况 (熟悉情况的人可能知道,这其实是一个设置断点然后continue的行为)以外,只有当前线程会执行。")]),t._v(" "),n("p",[n("strong",[t._v("thread apply ID1 ID2 command")])]),t._v(" "),n("p",[t._v("让一个或多个线程执行GDB命令command。")]),t._v(" "),n("p",[n("strong",[t._v("thread apply all command")])]),t._v(" "),n("p",[t._v("让所有被调试线程执行GDB命令command。")]),t._v(" "),n("h2",{attrs:{id:"_7-2-示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_7-2-示例"}},[t._v("#")]),t._v(" 7.2 示例")]),t._v(" "),n("h3",{attrs:{id:"_7-2-1-源代码test4-c"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_7-2-1-源代码test4-c"}},[t._v("#")]),t._v(" 7.2.1 源代码test4.c")]),t._v(" "),n("ol",[n("li",[t._v("/*")]),t._v(" "),n("li",[t._v("* 本文件为多线程调试测试准备")]),t._v(" "),n("li",[t._v("*/")]),t._v(" "),n("li",[t._v("#include ")]),t._v(" "),n("li",[t._v("#include ")]),t._v(" "),n("li",[t._v("#include ")]),t._v(" "),n("li",[t._v("#include ")]),t._v(" "),n("li"),t._v(" "),n("li",[n("strong",[t._v("void")]),t._v(" func1()")]),t._v(" "),n("li",[t._v("{")]),t._v(" "),n("li",[n("strong",[t._v("int")]),t._v(" i = 0;")]),t._v(" "),n("li",[n("strong",[t._v("while")]),t._v("(1){")]),t._v(" "),n("li",[t._v("i++;")]),t._v(" "),n("li",[t._v('printf("**********************************\\n");')]),t._v(" "),n("li",[t._v('printf("this is function 1!\\n");')]),t._v(" "),n("li",[t._v('printf("this is %d time!\\n", i);')]),t._v(" "),n("li",[t._v("sleep(1);")]),t._v(" "),n("li",[t._v("}")]),t._v(" "),n("li"),t._v(" "),n("li",[n("strong",[t._v("return")]),t._v(" ;")]),t._v(" "),n("li",[t._v("}")]),t._v(" "),n("li"),t._v(" "),n("li",[n("strong",[t._v("void")]),t._v(" func2()")]),t._v(" "),n("li",[t._v("{")]),t._v(" "),n("li",[n("strong",[t._v("int")]),t._v(" i = 0;")]),t._v(" "),n("li",[n("strong",[t._v("while")]),t._v("(1){")]),t._v(" "),n("li",[t._v("i++;")]),t._v(" "),n("li",[t._v('printf("**********************************\\n");')]),t._v(" "),n("li",[t._v('printf("this is function 2!\\n");')]),t._v(" "),n("li",[t._v('printf("this is %d time!\\n", i);')]),t._v(" "),n("li",[t._v("sleep(1);")]),t._v(" "),n("li",[t._v("}")]),t._v(" "),n("li",[n("strong",[t._v("return")]),t._v(" ;")]),t._v(" "),n("li",[t._v("}")]),t._v(" "),n("li"),t._v(" "),n("li"),t._v(" "),n("li",[n("strong",[t._v("int")]),t._v(" main()")]),t._v(" "),n("li",[t._v("{")]),t._v(" "),n("li",[t._v("pthread_t td1, td2, td3;")]),t._v(" "),n("li",[n("strong",[t._v("int")]),t._v(" ret_td1, ret_td2, ret_td3;")]),t._v(" "),n("li"),t._v(" "),n("li",[t._v("ret_td1 = pthread_create(&td1, NULL, ("),n("strong",[t._v("void")]),t._v("*)&func1, NULL);")]),t._v(" "),n("li",[t._v("ret_td2 = pthread_create(&td2, NULL, ("),n("strong",[t._v("void")]),t._v("*)&func2, NULL);")]),t._v(" "),n("li",[t._v("ret_td3 = pthread_create(&td3, NULL, ("),n("strong",[t._v("void")]),t._v("*)&func2, NULL);")]),t._v(" "),n("li"),t._v(" "),n("li",[n("strong",[t._v("if")]),t._v("(ret_td1 != 0){")]),t._v(" "),n("li",[t._v('printf("线程1创建失败\\n");')]),t._v(" "),n("li",[t._v("}"),n("strong",[t._v("else")]),t._v("{")]),t._v(" "),n("li",[t._v('printf("线程1创建成功\\n");')]),t._v(" "),n("li",[t._v("}")]),t._v(" "),n("li"),t._v(" "),n("li",[n("strong",[t._v("if")]),t._v("(ret_td2 != 0){")]),t._v(" "),n("li",[t._v('printf("线程2创建失败\\n");')]),t._v(" "),n("li",[t._v("}"),n("strong",[t._v("else")]),t._v("{")]),t._v(" "),n("li",[t._v('printf("线程2创建成功\\n");')]),t._v(" "),n("li",[t._v("}")]),t._v(" "),n("li"),t._v(" "),n("li",[n("strong",[t._v("if")]),t._v("(ret_td3 != 0){")]),t._v(" "),n("li",[t._v('printf("线程3创建失败\\n");')]),t._v(" "),n("li",[t._v("}"),n("strong",[t._v("else")]),t._v("{")]),t._v(" "),n("li",[t._v('printf("线程3创建成功\\n");')]),t._v(" "),n("li",[t._v("}")]),t._v(" "),n("li"),t._v(" "),n("li",[n("strong",[t._v("return")]),t._v(" 0;")]),t._v(" "),n("li",[t._v("}")])]),t._v(" "),n("h3",{attrs:{id:"_7-2-2-调试过程"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_7-2-2-调试过程"}},[t._v("#")]),t._v(" 7.2.2 调试过程")]),t._v(" "),n("p",[t._v("编译生成可执行文件,注意带上 "),n("em",[t._v("-lpthread")]),t._v(" :")]),t._v(" "),n("p",[n("em",[t._v("root@luo:~/workspace/test/exec\\>gcc -g ../source/test4.c -o test4 -lpthread")])]),t._v(" "),n("p",[t._v("启动GDB:")]),t._v(" "),n("p",[n("em",[t._v("root@luo:~/workspace/test/exec\\>gdb -q test4")])]),t._v(" "),n("p",[n("em",[t._v("Reading symbols from /home/luo/workspace/test/exec/test4...done.")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) b main --------------")]),t._v(" 在main()函数设置断点")]),t._v(" "),n("p",[n("em",[t._v("Breakpoint 1 at 0x400776: file ../source/test4.c, line 42.")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) l 1 --------------")]),t._v(" 列出源代码")]),t._v(" "),n("p",[n("em",[t._v("1 /*")])]),t._v(" "),n("p",[n("em",[t._v("2 * 本文件为多线程调试测试准备")])]),t._v(" "),n("p",[n("em",[t._v("3 */")])]),t._v(" "),n("p",[n("em",[t._v("4 #include ")])]),t._v(" "),n("p",[n("em",[t._v("5 #include ")])]),t._v(" "),n("p",[n("em",[t._v("6 #include ")])]),t._v(" "),n("p",[n("em",[t._v("7 #include ")])]),t._v(" "),n("p",[n("em",[t._v("8")])]),t._v(" "),n("p",[n("em",[t._v("9 void func1()")])]),t._v(" "),n("p",[n("em",[t._v("10 {")])]),t._v(" "),n("p",[n("em",[t._v("(gdb)")])]),t._v(" "),n("p",[n("em",[t._v("11 int i = 0;")])]),t._v(" "),n("p",[n("em",[t._v("12 while(1){")])]),t._v(" "),n("p",[n("em",[t._v("13 i++;")])]),t._v(" "),n("p",[n("em",[t._v('14 printf("**********************************\\n");')])]),t._v(" "),n("p",[n("em",[t._v('15 printf("this is function 1!\\n");')])]),t._v(" "),n("p",[n("em",[t._v('16 printf("this is %d time!\\n", i);')])]),t._v(" "),n("p",[n("em",[t._v("17 sleep(1);")])]),t._v(" "),n("p",[n("em",[t._v("18 }")])]),t._v(" "),n("p",[n("em",[t._v("19")])]),t._v(" "),n("p",[n("em",[t._v("20 return ;")])]),t._v(" "),n("p",[n("em",[t._v("(gdb)")])]),t._v(" "),n("p",[n("em",[t._v("21 }")])]),t._v(" "),n("p",[n("em",[t._v("22")])]),t._v(" "),n("p",[n("em",[t._v("23 void func2()")])]),t._v(" "),n("p",[n("em",[t._v("24 {")])]),t._v(" "),n("p",[n("em",[t._v("25 int i = 0;")])]),t._v(" "),n("p",[n("em",[t._v("26 while(1){")])]),t._v(" "),n("p",[n("em",[t._v("27 i++;")])]),t._v(" "),n("p",[n("em",[t._v('28 printf("**********************************\\n");')])]),t._v(" "),n("p",[n("em",[t._v('29 printf("this is function 2!\\n");')])]),t._v(" "),n("p",[n("em",[t._v('30 printf("this is %d time!\\n", i);')])]),t._v(" "),n("p",[n("em",[t._v("(gdb)")])]),t._v(" "),n("p",[n("em",[t._v("31 sleep(1);")])]),t._v(" "),n("p",[n("em",[t._v("32 }")])]),t._v(" "),n("p",[n("em",[t._v("33 return ;")])]),t._v(" "),n("p",[n("em",[t._v("34 }")])]),t._v(" "),n("p",[n("em",[t._v("35")])]),t._v(" "),n("p",[n("em",[t._v("36")])]),t._v(" "),n("p",[n("em",[t._v("37 int main()")])]),t._v(" "),n("p",[n("em",[t._v("38 {")])]),t._v(" "),n("p",[n("em",[t._v("39 pthread_t td1, td2, td3;")])]),t._v(" "),n("p",[n("em",[t._v("40 int ret_td1, ret_td2, ret_td3;")])]),t._v(" "),n("p",[n("em",[t._v("(gdb)")])]),t._v(" "),n("p",[n("em",[t._v("41")])]),t._v(" "),n("p",[n("em",[t._v("42 ret_td1 = pthread_create(&td1, NULL, (void*)&func1, NULL);")])]),t._v(" "),n("p",[n("em",[t._v("43 ret_td2 = pthread_create(&td2, NULL, (void*)&func2, NULL);")])]),t._v(" "),n("p",[n("em",[t._v("44 ret_td3 = pthread_create(&td3, NULL, (void*)&func2, NULL);")])]),t._v(" "),n("p",[n("em",[t._v("45")])]),t._v(" "),n("p",[n("em",[t._v("46 if(ret_td1 != 0){")])]),t._v(" "),n("p",[n("em",[t._v('47 printf("线程1创建失败\\n");')])]),t._v(" "),n("p",[n("em",[t._v("48 }else{")])]),t._v(" "),n("p",[n("em",[t._v('49 printf("线程1创建成功\\n");')])]),t._v(" "),n("p",[n("em",[t._v("50 }")])]),t._v(" "),n("p",[n("em",[t._v("(gdb)")])]),t._v(" "),n("p",[n("em",[t._v("51")])]),t._v(" "),n("p",[n("em",[t._v("52 if(ret_td2 != 0){")])]),t._v(" "),n("p",[n("em",[t._v('53 printf("线程2创建失败\\n");')])]),t._v(" "),n("p",[n("em",[t._v("54 }else{")])]),t._v(" "),n("p",[n("em",[t._v('55 printf("线程2创建成功\\n");')])]),t._v(" "),n("p",[n("em",[t._v("56 }")])]),t._v(" "),n("p",[n("em",[t._v("57")])]),t._v(" "),n("p",[n("em",[t._v("58 if(ret_td3 != 0){")])]),t._v(" "),n("p",[n("em",[t._v('59 printf("线程3创建失败\\n");')])]),t._v(" "),n("p",[n("em",[t._v("60 }else{")])]),t._v(" "),n("p",[n("em",[t._v("(gdb)")])]),t._v(" "),n("p",[n("em",[t._v('61 printf("线程3创建成功\\n");')])]),t._v(" "),n("p",[n("em",[t._v("62 }")])]),t._v(" "),n("p",[n("em",[t._v("63")])]),t._v(" "),n("p",[n("em",[t._v("64 return 0;")])]),t._v(" "),n("p",[n("em",[t._v("65 }")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) b 18 --------------")]),t._v(" 在18行设置断点")]),t._v(" "),n("p",[n("em",[t._v("Breakpoint 2 at 0x400725: file ../source/test4.c, line 18.")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) b 32 --------------")]),t._v(" 在32行设置断点")]),t._v(" "),n("p",[n("em",[t._v("Breakpoint 3 at 0x40076c: file ../source/test4.c, line 32.")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) b 46 --------------")]),t._v(" 在46行设置断点")]),t._v(" "),n("p",[n("em",[t._v("Breakpoint 4 at 0x4007d0: file ../source/test4.c, line 46.")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) r --------------")]),t._v(" 运行程序")]),t._v(" "),n("p",[n("em",[t._v("Starting program: /home/luo/workspace/test/exec/test4")])]),t._v(" "),n("p",[n("em",[t._v("[Thread debugging using libthread_db enabled]")])]),t._v(" "),n("p",[n("em",[t._v('Using host libthread_db library "/lib64/libthread_db.so.1".')])]),t._v(" "),n("p",[n("em",[t._v("Breakpoint 1, main () at ../source/test4.c:42")])]),t._v(" "),n("p",[n("em",[t._v("42 ret_td1 = pthread_create(&td1, NULL, (void*)&func1, NULL);")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) info threads --------------")]),t._v(" 查看线程信息,目前只有一个主线程")]),t._v(" "),n("p",[n("em",[t._v("Id Target Id Frame")])]),t._v(" "),n("p",[n("em",[t._v('* 1 Thread 0x7ffff7dd2700 (LWP 40907) "test4" main ()')])]),t._v(" "),n("p",[n("em",[t._v("at ../source/test4.c:42")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) c --------------")]),t._v(" 继续运行程序")]),t._v(" "),n("p",[n("em",[t._v("Continuing.")])]),t._v(" "),n("p",[n("em",[t._v("[New Thread 0x7ffff7dd0700 (LWP 40913)] --------------")]),t._v(" 新线程创建")]),t._v(" "),n("p",[n("em",[t._v("**********************************")])]),t._v(" "),n("p",[n("em",[t._v("[New Thread 0x7ffff75cf700 (LWP 40914)] --------------")]),t._v(" 新线程创建")]),t._v(" "),n("p",[n("em",[t._v("this is function 1!")])]),t._v(" "),n("p",[n("em",[t._v("this is 1 time!")])]),t._v(" "),n("p",[n("em",[t._v("[New Thread 0x7ffff6dce700 (LWP 40915)] --------------")]),t._v(" 新线程创建")]),t._v(" "),n("p",[n("em",[t._v("**********************************")])]),t._v(" "),n("p",[n("em",[t._v("Breakpoint 4, main () at ../source/test4.c:46")])]),t._v(" "),n("p",[n("em",[t._v("46 if(ret_td1 != 0){")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) info threads --------------")]),t._v(" 查看线程信息")]),t._v(" "),n("p",[n("em",[t._v("Id Target Id Frame")])]),t._v(" "),n("p",[n("em",[t._v('4 Thread 0x7ffff6dce700 (LWP 40915) "test4" 0x00000030552d795d in write () from /lib64/libc.so.6')])]),t._v(" "),n("p",[n("em",[t._v('3 Thread 0x7ffff75cf700 (LWP 40914) "test4" __lll_lock_wait_private ()')])]),t._v(" "),n("p",[n("em",[t._v("at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:95")])]),t._v(" "),n("p",[n("em",[t._v('2 Thread 0x7ffff7dd0700 (LWP 40913) "test4" 0x00000030552b5a0d in nanosleep () from /lib64/libc.so.6')])]),t._v(" "),n("p",[n("em",[t._v('* 1 Thread 0x7ffff7dd2700 (LWP 40907) "test4" main ()')])]),t._v(" "),n("p",[n("em",[t._v("at ../source/test4.c:46")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) set scheduler-locking on --------------")]),t._v(" 设置调试模式为只有当前线程会被执行")]),t._v(" "),n("p",[n("em",[t._v("(gdb) thread 4 --------------")]),t._v(" 切换到4号线程")]),t._v(" "),n("p",[n("em",[t._v("[Switching to thread 4 (Thread 0x7ffff6dce700 (LWP 40915))]")])]),t._v(" "),n("p",[n("em",[t._v("#0 0x00000030552d795d in write () from /lib64/libc.so.6")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) c --------------")]),t._v(" 当前线程执行continue")]),t._v(" "),n("p",[n("em",[t._v("Continuing.")])]),t._v(" "),n("p",[n("em",[t._v("this is function 2!")])]),t._v(" "),n("p",[n("em",[t._v("this is 1 time!")])]),t._v(" "),n("p",[n("em",[t._v("Breakpoint 3, func2 () at ../source/test4.c:32")])]),t._v(" "),n("p",[n("em",[t._v("32 }")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) c")])]),t._v(" "),n("p",[n("em",[t._v("Continuing.")])]),t._v(" "),n("p",[n("em",[t._v("**********************************")])]),t._v(" "),n("p",[n("em",[t._v("this is function 2!")])]),t._v(" "),n("p",[n("em",[t._v("this is 2 time!")])]),t._v(" "),n("p",[n("em",[t._v("Breakpoint 3, func2 () at ../source/test4.c:32")])]),t._v(" "),n("p",[n("em",[t._v("32 }")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) thread 3 --------------")]),t._v(" 切换线程")]),t._v(" "),n("p",[n("em",[t._v("[Switching to thread 3 (Thread 0x7ffff75cf700 (LWP 40914))]")])]),t._v(" "),n("p",[n("em",[t._v("#0 __lll_lock_wait_private ()")])]),t._v(" "),n("p",[n("em",[t._v("at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:95")])]),t._v(" "),n("p",[n("em",[t._v("95 ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S: No such file or directory.")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) c")])]),t._v(" "),n("p",[n("em",[t._v("Continuing.")])]),t._v(" "),n("p",[n("em",[t._v("**********************************")])]),t._v(" "),n("p",[n("em",[t._v("this is function 2!")])]),t._v(" "),n("p",[n("em",[t._v("this is 1 time!")])]),t._v(" "),n("p",[n("em",[t._v("Breakpoint 3, func2 () at ../source/test4.c:32")])]),t._v(" "),n("p",[n("em",[t._v("32 }")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) c")])]),t._v(" "),n("p",[n("em",[t._v("Continuing.")])]),t._v(" "),n("p",[n("em",[t._v("**********************************")])]),t._v(" "),n("p",[n("em",[t._v("this is function 2!")])]),t._v(" "),n("p",[n("em",[t._v("this is 2 time!")])]),t._v(" "),n("p",[n("em",[t._v("Breakpoint 3, func2 () at ../source/test4.c:32")])]),t._v(" "),n("p",[n("em",[t._v("32 }")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) thread 2 --------------")]),t._v(" 切换线程")]),t._v(" "),n("p",[n("em",[t._v("[Switching to thread 2 (Thread 0x7ffff7dd0700 (LWP 40913))]")])]),t._v(" "),n("p",[n("em",[t._v("#0 0x00000030552f081b in ?? () from /lib64/libc.so.6")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) c")])]),t._v(" "),n("p",[n("em",[t._v("Continuing.")])]),t._v(" "),n("p",[n("em",[t._v("**********************************")])]),t._v(" "),n("p",[n("em",[t._v("this is function 1!")])]),t._v(" "),n("p",[n("em",[t._v("this is 2 time!")])]),t._v(" "),n("p",[n("em",[t._v("Breakpoint 2, func1 () at ../source/test4.c:18")])]),t._v(" "),n("p",[n("em",[t._v("18 }")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) c")])]),t._v(" "),n("p",[n("em",[t._v("Continuing.")])]),t._v(" "),n("p",[n("em",[t._v("**********************************")])]),t._v(" "),n("p",[n("em",[t._v("this is function 1!")])]),t._v(" "),n("p",[n("em",[t._v("this is 3 time!")])]),t._v(" "),n("p",[n("em",[t._v("Breakpoint 2, func1 () at ../source/test4.c:18")])]),t._v(" "),n("p",[n("em",[t._v("18 }")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) info threads --------------")]),t._v(" 查看线程信息,当前位于2号线程")]),t._v(" "),n("p",[n("em",[t._v("Id Target Id Frame")])]),t._v(" "),n("p",[n("em",[t._v('4 Thread 0x7ffff6dce700 (LWP 40915) "test4" func2 ()')])]),t._v(" "),n("p",[n("em",[t._v("at ../source/test4.c:32")])]),t._v(" "),n("p",[n("em",[t._v('3 Thread 0x7ffff75cf700 (LWP 40914) "test4" func2 ()')])]),t._v(" "),n("p",[n("em",[t._v("at ../source/test4.c:32")])]),t._v(" "),n("p",[n("em",[t._v('* 2 Thread 0x7ffff7dd0700 (LWP 40913) "test4" func1 ()')])]),t._v(" "),n("p",[n("em",[t._v("at ../source/test4.c:18")])]),t._v(" "),n("p",[n("em",[t._v('1 Thread 0x7ffff7dd2700 (LWP 40907) "test4" main ()')])]),t._v(" "),n("p",[n("em",[t._v("at ../source/test4.c:46")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) thread apply 2 4 continue -----")]),t._v(" 令2号和4号线程执行continue")]),t._v(" "),n("p",[n("em",[t._v("Thread 2 (Thread 0x7ffff7dd0700 (LWP 40913)):")])]),t._v(" "),n("p",[n("em",[t._v("Continuing.")])]),t._v(" "),n("p",[n("em",[t._v("**********************************")])]),t._v(" "),n("p",[n("em",[t._v("this is function 1!")])]),t._v(" "),n("p",[n("em",[t._v("this is 4 time!")])]),t._v(" "),n("p",[n("em",[t._v("Breakpoint 2, func1 () at ../source/test4.c:18")])]),t._v(" "),n("p",[n("em",[t._v("18 }")])]),t._v(" "),n("p",[n("em",[t._v("Thread 4 (Thread 0x7ffff6dce700 (LWP 40915)):")])]),t._v(" "),n("p",[n("em",[t._v("Continuing.")])]),t._v(" "),n("p",[n("em",[t._v("**********************************")])]),t._v(" "),n("p",[n("em",[t._v("this is function 2!")])]),t._v(" "),n("p",[n("em",[t._v("this is 3 time!")])]),t._v(" "),n("p",[n("em",[t._v("Breakpoint 3, func2 () at ../source/test4.c:32")])]),t._v(" "),n("p",[n("em",[t._v("32 }")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) thread apply all continue -------------")]),t._v(" 所有线程执行continue")]),t._v(" "),n("p",[n("em",[t._v("Thread 4 (Thread 0x7ffff6dce700 (LWP 40915)):")])]),t._v(" "),n("p",[n("em",[t._v("Continuing.")])]),t._v(" "),n("p",[n("em",[t._v("**********************************")])]),t._v(" "),n("p",[n("em",[t._v("this is function 2!")])]),t._v(" "),n("p",[n("em",[t._v("this is 4 time!")])]),t._v(" "),n("p",[n("em",[t._v("Breakpoint 3, func2 () at ../source/test4.c:32")])]),t._v(" "),n("p",[n("em",[t._v("32 }")])]),t._v(" "),n("p",[n("em",[t._v("Thread 3 (Thread 0x7ffff75cf700 (LWP 40914)):")])]),t._v(" "),n("p",[n("em",[t._v("Continuing.")])]),t._v(" "),n("p",[n("em",[t._v("**********************************")])]),t._v(" "),n("p",[n("em",[t._v("this is function 2!")])]),t._v(" "),n("p",[n("em",[t._v("this is 3 time!")])]),t._v(" "),n("p",[n("em",[t._v("Breakpoint 3, func2 () at ../source/test4.c:32")])]),t._v(" "),n("p",[n("em",[t._v("32 }")])]),t._v(" "),n("p",[n("em",[t._v("Thread 2 (Thread 0x7ffff7dd0700 (LWP 40913)):")])]),t._v(" "),n("p",[n("em",[t._v("Continuing.")])]),t._v(" "),n("p",[n("em",[t._v("**********************************")])]),t._v(" "),n("p",[n("em",[t._v("this is function 1!")])]),t._v(" "),n("p",[n("em",[t._v("this is 5 time!")])]),t._v(" "),n("p",[n("em",[t._v("Breakpoint 2, func1 () at ../source/test4.c:18")])]),t._v(" "),n("p",[n("em",[t._v("18 }")])]),t._v(" "),n("p",[n("em",[t._v("Thread 1 (Thread 0x7ffff7dd2700 (LWP 40907)):")])]),t._v(" "),n("p",[n("em",[t._v("Continuing.")])]),t._v(" "),n("p",[n("em",[t._v("线程1创建成功")])]),t._v(" "),n("p",[n("em",[t._v("线程2创建成功")])]),t._v(" "),n("p",[n("em",[t._v("线程3创建成功")])]),t._v(" "),n("p",[n("em",[t._v("[Thread 0x7ffff6dce700 (LWP 40915) exited]")])]),t._v(" "),n("p",[n("em",[t._v("[Thread 0x7ffff75cf700 (LWP 40914) exited]")])]),t._v(" "),n("p",[n("em",[t._v("[Thread 0x7ffff7dd0700 (LWP 40913) exited]")])]),t._v(" "),n("p",[n("em",[t._v("[Inferior 1 (process 40907) exited normally]")])]),t._v(" "),n("p",[n("em",[t._v("(gdb)")])]),t._v(" "),n("h1",{attrs:{id:"_8-死锁调试"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_8-死锁调试"}},[t._v("#")]),t._v(" 8 死锁调试")]),t._v(" "),n("h2",{attrs:{id:"_8-1-使用命令"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_8-1-使用命令"}},[t._v("#")]),t._v(" 8.1 使用命令")]),t._v(" "),n("p",[n("strong",[t._v("ps -ef|grep ")])]),t._v(" "),n("p",[t._v("查看进程号,其中processname为进程名。")]),t._v(" "),n("p",[n("strong",[t._v("gdb attach ")])]),t._v(" "),n("p",[t._v("使用GDB调试正在运行的进程。")]),t._v(" "),n("h2",{attrs:{id:"_8-2-示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_8-2-示例"}},[t._v("#")]),t._v(" 8.2 示例")]),t._v(" "),n("h3",{attrs:{id:"_8-2-1-源文件test5-c"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_8-2-1-源文件test5-c"}},[t._v("#")]),t._v(" 8.2.1 源文件test5.c")]),t._v(" "),n("ol",[n("li",[t._v("/*")]),t._v(" "),n("li",[t._v("*本文件用于测试死锁调试")]),t._v(" "),n("li",[t._v("*")]),t._v(" "),n("li",[t._v("*代码来自网络:http://blog.chinaunix.net/uid-30343738-id-5757210.html")]),t._v(" "),n("li",[t._v("*")]),t._v(" "),n("li",[t._v("*/")]),t._v(" "),n("li"),t._v(" "),n("li",[t._v("#include ")]),t._v(" "),n("li",[t._v("#include ")]),t._v(" "),n("li",[t._v("#include ")]),t._v(" "),n("li",[t._v("#include ")]),t._v(" "),n("li",[t._v("#include ")]),t._v(" "),n("li"),t._v(" "),n("li",[t._v("pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;")]),t._v(" "),n("li",[t._v("pthread_mutex_t mutex2 = PTHREAD_MUTEX_INITIALIZER;")]),t._v(" "),n("li",[t._v("pthread_mutex_t mutex3 = PTHREAD_MUTEX_INITIALIZER;")]),t._v(" "),n("li",[t._v("pthread_mutex_t mutex4 = PTHREAD_MUTEX_INITIALIZER;")]),t._v(" "),n("li"),t._v(" "),n("li",[n("strong",[t._v("static")]),t._v(" "),n("strong",[t._v("int")]),t._v(" sequence1 = 0;")]),t._v(" "),n("li",[n("strong",[t._v("static")]),t._v(" "),n("strong",[t._v("int")]),t._v(" sequence2 = 0;")]),t._v(" "),n("li"),t._v(" "),n("li",[n("strong",[t._v("int")]),t._v(" func1()")]),t._v(" "),n("li",[t._v("{")]),t._v(" "),n("li",[t._v("pthread_mutex_lock(&mutex1);")]),t._v(" "),n("li",[t._v("++sequence1;")]),t._v(" "),n("li",[t._v("sleep(1);")]),t._v(" "),n("li",[t._v("pthread_mutex_lock(&mutex2);")]),t._v(" "),n("li",[t._v("++sequence2;")]),t._v(" "),n("li",[t._v("pthread_mutex_unlock(&mutex2);")]),t._v(" "),n("li",[t._v("pthread_mutex_unlock(&mutex1);")]),t._v(" "),n("li"),t._v(" "),n("li",[n("strong",[t._v("return")]),t._v(" sequence1;")]),t._v(" "),n("li",[t._v("}")]),t._v(" "),n("li"),t._v(" "),n("li",[n("strong",[t._v("int")]),t._v(" func2()")]),t._v(" "),n("li",[t._v("{")]),t._v(" "),n("li",[t._v("pthread_mutex_lock(&mutex2);")]),t._v(" "),n("li",[t._v("++sequence2;")]),t._v(" "),n("li",[t._v("sleep(1);")]),t._v(" "),n("li",[t._v("pthread_mutex_lock(&mutex1);")]),t._v(" "),n("li",[t._v("++sequence1;")]),t._v(" "),n("li",[t._v("pthread_mutex_unlock(&mutex1);")]),t._v(" "),n("li",[t._v("pthread_mutex_unlock(&mutex2);")]),t._v(" "),n("li"),t._v(" "),n("li",[n("strong",[t._v("return")]),t._v(" sequence2;")]),t._v(" "),n("li",[t._v("}")]),t._v(" "),n("li"),t._v(" "),n("li",[n("strong",[t._v("void")]),t._v("* thread1("),n("strong",[t._v("void")]),t._v("* arg)")]),t._v(" "),n("li",[t._v("{")]),t._v(" "),n("li",[n("strong",[t._v("while")]),t._v(" (1)")]),t._v(" "),n("li",[t._v("{")]),t._v(" "),n("li",[n("strong",[t._v("int")]),t._v(" iRetValue = func1();")]),t._v(" "),n("li"),t._v(" "),n("li",[n("strong",[t._v("if")]),t._v(" (iRetValue == 100000)")]),t._v(" "),n("li",[t._v("{")]),t._v(" "),n("li",[t._v("pthread_exit(NULL);")]),t._v(" "),n("li",[t._v("}")]),t._v(" "),n("li",[t._v("}")]),t._v(" "),n("li",[t._v("}")]),t._v(" "),n("li"),t._v(" "),n("li",[n("strong",[t._v("void")]),t._v("* thread2("),n("strong",[t._v("void")]),t._v("* arg)")]),t._v(" "),n("li",[t._v("{")]),t._v(" "),n("li",[n("strong",[t._v("while")]),t._v(" (1)")]),t._v(" "),n("li",[t._v("{")]),t._v(" "),n("li",[n("strong",[t._v("int")]),t._v(" iRetValue = func2();")]),t._v(" "),n("li"),t._v(" "),n("li",[n("strong",[t._v("if")]),t._v(" (iRetValue == 100000)")]),t._v(" "),n("li",[t._v("{")]),t._v(" "),n("li",[t._v("pthread_exit(NULL);")]),t._v(" "),n("li",[t._v("}")]),t._v(" "),n("li",[t._v("}")]),t._v(" "),n("li",[t._v("}")]),t._v(" "),n("li"),t._v(" "),n("li",[n("strong",[t._v("void")]),t._v("* thread3("),n("strong",[t._v("void")]),t._v("* arg)")]),t._v(" "),n("li",[t._v("{")]),t._v(" "),n("li",[n("strong",[t._v("while")]),t._v(" (1)")]),t._v(" "),n("li",[t._v("{")]),t._v(" "),n("li",[t._v("sleep(1);")]),t._v(" "),n("li",[n("strong",[t._v("char")]),t._v(" szBuf[128];")]),t._v(" "),n("li",[t._v("memset(szBuf, 0, "),n("strong",[t._v("sizeof")]),t._v("(szBuf));")]),t._v(" "),n("li",[t._v('strcpy(szBuf, "thread3");')]),t._v(" "),n("li",[t._v("}")]),t._v(" "),n("li",[t._v("}")]),t._v(" "),n("li"),t._v(" "),n("li",[n("strong",[t._v("void")]),t._v("* thread4("),n("strong",[t._v("void")]),t._v("* arg)")]),t._v(" "),n("li",[t._v("{")]),t._v(" "),n("li",[n("strong",[t._v("while")]),t._v(" (1)")]),t._v(" "),n("li",[t._v("{")]),t._v(" "),n("li",[t._v("sleep(1);")]),t._v(" "),n("li",[n("strong",[t._v("char")]),t._v(" szBuf[128];")]),t._v(" "),n("li",[t._v("memset(szBuf, 0, "),n("strong",[t._v("sizeof")]),t._v("(szBuf));")]),t._v(" "),n("li",[t._v('strcpy(szBuf, "thread3");')]),t._v(" "),n("li",[t._v("}")]),t._v(" "),n("li",[t._v("}")]),t._v(" "),n("li"),t._v(" "),n("li",[n("strong",[t._v("int")]),t._v(" main()")]),t._v(" "),n("li",[t._v("{")]),t._v(" "),n("li",[t._v("pthread_t tid[4];")]),t._v(" "),n("li",[n("strong",[t._v("if")]),t._v(" (pthread_create(&tid[0], NULL, &thread1, NULL) != 0)")]),t._v(" "),n("li",[t._v("{")]),t._v(" "),n("li",[t._v("_exit(1);")]),t._v(" "),n("li",[t._v("}")]),t._v(" "),n("li",[n("strong",[t._v("if")]),t._v(" (pthread_create(&tid[1], NULL, &thread2, NULL) != 0)")]),t._v(" "),n("li",[t._v("{")]),t._v(" "),n("li",[t._v("_exit(1);")]),t._v(" "),n("li",[t._v("}")]),t._v(" "),n("li",[n("strong",[t._v("if")]),t._v(" (pthread_create(&tid[2], NULL, &thread3, NULL) != 0)")]),t._v(" "),n("li",[t._v("{")]),t._v(" "),n("li",[t._v("_exit(1);")]),t._v(" "),n("li",[t._v("}")]),t._v(" "),n("li",[n("strong",[t._v("if")]),t._v(" (pthread_create(&tid[3], NULL, &thread4, NULL) != 0)")]),t._v(" "),n("li",[t._v("{")]),t._v(" "),n("li",[t._v("_exit(1);")]),t._v(" "),n("li",[t._v("}")]),t._v(" "),n("li"),t._v(" "),n("li",[t._v("sleep(5);")]),t._v(" "),n("li",[t._v("//pthread_cancel(tid[0]);")]),t._v(" "),n("li"),t._v(" "),n("li",[t._v("pthread_join(tid[0], NULL);")]),t._v(" "),n("li",[t._v("pthread_join(tid[1], NULL);")]),t._v(" "),n("li",[t._v("pthread_join(tid[2], NULL);")]),t._v(" "),n("li",[t._v("pthread_join(tid[3], NULL);")]),t._v(" "),n("li"),t._v(" "),n("li",[t._v("pthread_mutex_destroy(&mutex1);")]),t._v(" "),n("li",[t._v("pthread_mutex_destroy(&mutex2);")]),t._v(" "),n("li",[t._v("pthread_mutex_destroy(&mutex3);")]),t._v(" "),n("li",[t._v("pthread_mutex_destroy(&mutex4);")]),t._v(" "),n("li"),t._v(" "),n("li",[n("strong",[t._v("return")]),t._v(" 0;")]),t._v(" "),n("li",[t._v("}")])]),t._v(" "),n("h3",{attrs:{id:"_8-2-2-调试过程"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_8-2-2-调试过程"}},[t._v("#")]),t._v(" 8.2.2 调试过程")]),t._v(" "),n("p",[t._v("执行程序,程序会卡在这里:")]),t._v(" "),n("p",[n("a",{attrs:{href:"mailto:root@luo:~/workspace/test/exec%3e./test5"}},[n("em",[t._v("root@luo:~/workspace/test/exec\\>./test5")])])]),t._v(" "),n("p",[t._v("另开一个终端,查看进程的信息:")]),t._v(" "),n("p",[n("em",[t._v("root@luo:~/workspace/test/exec\\>ps -ef|grep test5")])]),t._v(" "),n("p",[n("em",[t._v("root 42746 39442 0 14:25 ttyp0 00:00:00 ./test5")])]),t._v(" "),n("p",[n("em",[t._v("root 43464 42753 0 15:11 ttyp2 00:00:00 grep --color=auto test5")])]),t._v(" "),n("p",[t._v("使用GDB工具attach该进程:")]),t._v(" "),n("p",[n("em",[t._v("root@luo:~/workspace/test/exec\\>gdb -q attach 42746")])]),t._v(" "),n("p",[n("em",[t._v("attach: No such file or directory.")])]),t._v(" "),n("p",[n("em",[t._v("Attaching to process 42746")])]),t._v(" "),n("p",[n("em",[t._v("Reading symbols from /home/luo/workspace/test/exec/test5...done.")])]),t._v(" "),n("p",[n("em",[t._v("Reading symbols from /lib64/libpthread.so.0...done.")])]),t._v(" "),n("p",[n("em",[t._v("[New LWP 42750]")])]),t._v(" "),n("p",[n("em",[t._v("[New LWP 42749]")])]),t._v(" "),n("p",[n("em",[t._v("[New LWP 42748]")])]),t._v(" "),n("p",[n("em",[t._v("[New LWP 42747]")])]),t._v(" "),n("p",[n("em",[t._v("[Thread debugging using libthread_db enabled]")])]),t._v(" "),n("p",[n("em",[t._v('Using host libthread_db library "/lib64/libthread_db.so.1".')])]),t._v(" "),n("p",[n("em",[t._v("Loaded symbols for /lib64/libpthread.so.0")])]),t._v(" "),n("p",[n("em",[t._v("Reading symbols from /lib64/libc.so.6...(no debugging symbols found)...done.")])]),t._v(" "),n("p",[n("em",[t._v("Loaded symbols for /lib64/libc.so.6")])]),t._v(" "),n("p",[n("em",[t._v("Reading symbols from /lib64/ld-linux-x86-64.so.2...(no debugging symbols found)...done.")])]),t._v(" "),n("p",[n("em",[t._v("Loaded symbols for /lib64/ld-linux-x86-64.so.2")])]),t._v(" "),n("p",[n("em",[t._v("0x00007fc3aa9ff492 in pthread_join (threadid=140478357907200, thread_return=0x0)")])]),t._v(" "),n("p",[n("em",[t._v("at pthread_join.c:92")])]),t._v(" "),n("p",[n("em",[t._v("92 pthread_join.c: No such file or directory.")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) info threads -------------")]),t._v(" 查看线程信息")]),t._v(" "),n("p",[n("em",[t._v("Id Target Id Frame")])]),t._v(" "),n("p",[n("em",[t._v('5 Thread 0x7fc3aa9f2700 (LWP 42747) "test5" __lll_lock_wait ()')])]),t._v(" "),n("p",[n("em",[t._v("at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:135")])]),t._v(" "),n("p",[n("em",[t._v('4 Thread 0x7fc3aa1f1700 (LWP 42748) "test5" __lll_lock_wait ()')])]),t._v(" "),n("p",[n("em",[t._v("at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:135")])]),t._v(" "),n("p",[n("em",[t._v('3 Thread 0x7fc3a99f0700 (LWP 42749) "test5" 0x00000030552b5a0d in nanosleep')])]),t._v(" "),n("p",[n("em",[t._v("() from /lib64/libc.so.6")])]),t._v(" "),n("p",[n("em",[t._v('2 Thread 0x7fc3a91ef700 (LWP 42750) "test5" 0x00000030552b5a0d in nanosleep')])]),t._v(" "),n("p",[n("em",[t._v("() from /lib64/libc.so.6")])]),t._v(" "),n("p",[n("em",[t._v('* 1 Thread 0x7fc3aa9f4700 (LWP 42746) "test5" 0x00007fc3aa9ff492 in pthread_join (threadid=140478357907200, thread_return=0x0) at pthread_join.c:92')])]),t._v(" "),n("p",[n("em",[t._v("(gdb) set scheduler-locking on ---------")]),t._v(" 设置调试模式为只有当前线程会执行")]),t._v(" "),n("p",[n("em",[t._v("(gdb) thread apply all bt -------------")]),t._v(" 显示所有线程的栈信息")]),t._v(" "),n("p",[n("em",[t._v("Thread 5 (Thread 0x7fc3aa9f2700 (LWP 42747)):")])]),t._v(" "),n("p",[n("em",[t._v("#0 __lll_lock_wait ()")])]),t._v(" "),n("p",[n("em",[t._v("at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:135")])]),t._v(" "),n("p",[n("em",[t._v("#1 0x00007fc3aaa00457 in _L_lock_913 () from /lib64/libpthread.so.0")])]),t._v(" "),n("p",[n("em",[t._v("#2 0x00007fc3aaa00280 in __GI___pthread_mutex_lock (mutex=0x6012c0 )")])]),t._v(" "),n("p",[n("em",[t._v("at ../nptl/pthread_mutex_lock.c:79")])]),t._v(" "),n("p",[n("em",[t._v("#3 0x00000000004008b1 in func1 () at test5.c:27")])]),t._v(" "),n("p",[n("em",[t._v("#4 0x000000000040094e in thread1 (arg=0x0) at test5.c:52")])]),t._v(" "),n("p",[n("em",[t._v("#5 0x00007fc3aa9fe092 in start_thread (arg=0x7fc3aa9f2700)")])]),t._v(" "),n("p",[n("em",[t._v("at pthread_create.c:309")])]),t._v(" "),n("p",[n("em",[t._v("#6 0x00000030552e42bd in clone () from /lib64/libc.so.6")])]),t._v(" "),n("p",[n("em",[t._v("Thread 4 (Thread 0x7fc3aa1f1700 (LWP 42748)):")])]),t._v(" "),n("p",[n("em",[t._v("#0 __lll_lock_wait ()")])]),t._v(" "),n("p",[n("em",[t._v("at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:135")])]),t._v(" "),n("p",[n("em",[t._v("#1 0x00007fc3aaa00457 in _L_lock_913 () from /lib64/libpthread.so.0")])]),t._v(" "),n("p",[n("em",[t._v("#2 0x00007fc3aaa00280 in __GI___pthread_mutex_lock (mutex=0x601280 )")])]),t._v(" "),n("p",[n("em",[t._v("at ../nptl/pthread_mutex_lock.c:79")])]),t._v(" "),n("p",[n("em",[t._v("#3 0x000000000040090d in func2 () at test5.c:40")])]),t._v(" "),n("p",[n("em",[t._v("#4 0x000000000040097c in thread2 (arg=0x0) at test5.c:65")])]),t._v(" "),n("p",[n("em",[t._v("#5 0x00007fc3aa9fe092 in start_thread (arg=0x7fc3aa1f1700)")])]),t._v(" "),n("p",[n("em",[t._v("at pthread_create.c:309")])]),t._v(" "),n("p",[n("em",[t._v("#6 0x00000030552e42bd in clone () from /lib64/libc.so.6")])]),t._v(" "),n("p",[n("em",[t._v("Thread 3 (Thread 0x7fc3a99f0700 (LWP 42749)):")])]),t._v(" "),n("p",[n("em",[t._v("#0 0x00000030552b5a0d in nanosleep () from /lib64/libc.so.6")])]),t._v(" "),n("p",[n("em",[t._v("#1 0x00000030552b58a4 in sleep () from /lib64/libc.so.6")])]),t._v(" "),n("p",[n("em",[t._v("#2 0x00000000004009b0 in thread3 (arg=0x0) at test5.c:78")])]),t._v(" "),n("p",[n("em",[t._v("#3 0x00007fc3aa9fe092 in start_thread (arg=0x7fc3a99f0700)")])]),t._v(" "),n("p",[n("em",[t._v("at pthread_create.c:309")])]),t._v(" "),n("p",[n("em",[t._v("#4 0x00000030552e42bd in clone () from /lib64/libc.so.6")])]),t._v(" "),n("p",[n("em",[t._v("Thread 2 (Thread 0x7fc3a91ef700 (LWP 42750)):")])]),t._v(" "),n("p",[n("em",[t._v("#0 0x00000030552b5a0d in nanosleep () from /lib64/libc.so.6")])]),t._v(" "),n("p",[n("em",[t._v("#1 0x00000030552b58a4 in sleep () from /lib64/libc.so.6")])]),t._v(" "),n("p",[n("em",[t._v("#2 0x00000000004009f5 in thread4 (arg=0x0) at test5.c:89")])]),t._v(" "),n("p",[n("em",[t._v("#3 0x00007fc3aa9fe092 in start_thread (arg=0x7fc3a91ef700)")])]),t._v(" "),n("p",[n("em",[t._v("at pthread_create.c:309")])]),t._v(" "),n("p",[n("em",[t._v("#4 0x00000030552e42bd in clone () from /lib64/libc.so.6")])]),t._v(" "),n("p",[n("em",[t._v("---Type to continue, or q to quit---")])]),t._v(" "),n("p",[n("em",[t._v("Thread 1 (Thread 0x7fc3aa9f4700 (LWP 42746)):")])]),t._v(" "),n("p",[n("em",[t._v("#0 0x00007fc3aa9ff492 in pthread_join (threadid=140478357907200,")])]),t._v(" "),n("p",[n("em",[t._v("thread_return=0x0) at pthread_join.c:92")])]),t._v(" "),n("p",[n("em",[t._v("#1 0x0000000000400af1 in main () at test5.c:119")])]),t._v(" "),n("p",[t._v("从栈信息可以初步判断,有可能是4号和5号线程锁住了。")]),t._v(" "),n("p",[t._v("查看27行和40行源文件的代码:")]),t._v(" "),n("p",[n("em",[t._v("(gdb) l test5.c:27")])]),t._v(" "),n("p",[n("em",[t._v("22 int func1()")])]),t._v(" "),n("p",[n("em",[t._v("23 {")])]),t._v(" "),n("p",[n("em",[t._v("24 pthread_mutex_lock(&mutex1);")])]),t._v(" "),n("p",[n("em",[t._v("25 ++sequence1;")])]),t._v(" "),n("p",[n("em",[t._v("26 sleep(1);")])]),t._v(" "),n("p",[n("em",[t._v("27 pthread_mutex_lock(&mutex2);")])]),t._v(" "),n("p",[n("em",[t._v("28 ++sequence2;")])]),t._v(" "),n("p",[n("em",[t._v("29 pthread_mutex_unlock(&mutex2);")])]),t._v(" "),n("p",[n("em",[t._v("30 pthread_mutex_unlock(&mutex1);")])]),t._v(" "),n("p",[n("em",[t._v("31")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) l test5.c:40")])]),t._v(" "),n("p",[n("em",[t._v("35 int func2()")])]),t._v(" "),n("p",[n("em",[t._v("36 {")])]),t._v(" "),n("p",[n("em",[t._v("37 pthread_mutex_lock(&mutex2);")])]),t._v(" "),n("p",[n("em",[t._v("38 ++sequence2;")])]),t._v(" "),n("p",[n("em",[t._v("39 sleep(1);")])]),t._v(" "),n("p",[n("em",[t._v("40 pthread_mutex_lock(&mutex1);")])]),t._v(" "),n("p",[n("em",[t._v("41 ++sequence1;")])]),t._v(" "),n("p",[n("em",[t._v("42 pthread_mutex_unlock(&mutex1);")])]),t._v(" "),n("p",[n("em",[t._v("43 pthread_mutex_unlock(&mutex2);")])]),t._v(" "),n("p",[n("em",[t._v("44")])]),t._v(" "),n("p",[t._v("看一下4号和5号线程是不是锁住了:")]),t._v(" "),n("p",[n("em",[t._v("(gdb) thread 5 -------------")]),t._v(" 切换到5号线程")]),t._v(" "),n("p",[n("em",[t._v("[Switching to thread 5 (Thread 0x7fc3aa9f2700 (LWP 42747))]")])]),t._v(" "),n("p",[n("em",[t._v("#0 __lll_lock_wait ()")])]),t._v(" "),n("p",[n("em",[t._v("at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:135")])]),t._v(" "),n("p",[n("em",[t._v("135 ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S: No such file or directory.")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) n -------------")]),t._v(" 执行下一步,卡住,Ctrl+C跳出")]),t._v(" "),n("p",[n("em",[t._v("^C")])]),t._v(" "),n("p",[n("em",[t._v("Program received signal SIGINT, Interrupt.")])]),t._v(" "),n("p",[n("em",[t._v("__lll_lock_wait () at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:135")])]),t._v(" "),n("p",[n("em",[t._v("135 in ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) thread 2 -------------")]),t._v(" 切换到2号线程")]),t._v(" "),n("p",[n("em",[t._v("[Switching to thread 2 (Thread 0x7fc3a91ef700 (LWP 42750))]")])]),t._v(" "),n("p",[n("em",[t._v("#0 0x00000030552b5a0d in nanosleep () from /lib64/libc.so.6")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) n -------------")]),t._v(" 执行下一步,可正常执行")]),t._v(" "),n("p",[n("em",[t._v("Single stepping until exit from function nanosleep,")])]),t._v(" "),n("p",[n("em",[t._v("which has no line number information.")])]),t._v(" "),n("p",[n("em",[t._v("0x00000030552b58a4 in sleep () from /lib64/libc.so.6")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) n")])]),t._v(" "),n("p",[n("em",[t._v("Single stepping until exit from function sleep,")])]),t._v(" "),n("p",[n("em",[t._v("which has no line number information.")])]),t._v(" "),n("p",[n("em",[t._v("thread4 (arg=0x0) at test5.c:91")])]),t._v(" "),n("p",[n("em",[t._v("91 memset(szBuf, 0, sizeof(szBuf));")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) thread 4 -------------")]),t._v(" 切换到4号线程")]),t._v(" "),n("p",[n("em",[t._v("[Switching to thread 4 (Thread 0x7fc3aa1f1700 (LWP 42748))]")])]),t._v(" "),n("p",[n("em",[t._v("#0 __lll_lock_wait ()")])]),t._v(" "),n("p",[n("em",[t._v("at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:135")])]),t._v(" "),n("p",[n("em",[t._v("135 ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S: No such file or directory.")])]),t._v(" "),n("p",[n("em",[t._v("(gdb) n -------------")]),t._v(" 执行下一步,卡住")]),t._v(" "),n("p",[n("em",[t._v("^C^C")])]),t._v(" "),n("p",[n("em",[t._v("Program received signal SIGINT, Interrupt.")])]),t._v(" "),n("p",[n("em",[t._v("__lll_lock_wait () at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:135")])]),t._v(" "),n("p",[n("em",[t._v("135 in ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S")])]),t._v(" "),n("p",[n("em",[t._v("(gdb)")])]),t._v(" "),n("p",[t._v("以上方法可调试找出程序中出现死锁的地方。")]),t._v(" "),n("h1",{attrs:{id:"_9-core文件调试"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_9-core文件调试"}},[t._v("#")]),t._v(" 9 core文件调试")]),t._v(" "),n("h2",{attrs:{id:"_9-1-使用命令"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_9-1-使用命令"}},[t._v("#")]),t._v(" 9.1 使用命令")]),t._v(" "),n("p",[n("strong",[t._v("ulimit -c")])]),t._v(" "),n("p",[t._v("查看core文件生成的大小限制,若为0,则表示不会生成core文件。(注:ulimit不会影响其他shell终端)")]),t._v(" "),n("p",[n("strong",[t._v("ulimit -c ")])]),t._v(" "),n("p",[t._v("设置core文件生成的大小。")]),t._v(" "),n("p",[n("strong",[t._v("cat /proc/sys/kernel/core_pattern")])]),t._v(" "),n("p",[t._v("查看core文件路径。")]),t._v(" "),n("p",[n("strong",[t._v("gdb ")])]),t._v(" "),n("p",[t._v("调试core文件")]),t._v(" "),n("h2",{attrs:{id:"_9-2-示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_9-2-示例"}},[t._v("#")]),t._v(" 9.2 示例")]),t._v(" "),n("h3",{attrs:{id:"_9-2-1-源代码test6-c"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_9-2-1-源代码test6-c"}},[t._v("#")]),t._v(" 9.2.1 源代码test6.c")]),t._v(" "),n("p",[t._v("一个能产生core dump的程序")]),t._v(" "),n("ol",[n("li",[t._v("#include ")]),t._v(" "),n("li",[n("strong",[t._v("static")]),t._v(" "),n("strong",[t._v("void")]),t._v(" sub("),n("strong",[t._v("void")]),t._v(");")]),t._v(" "),n("li",[n("strong",[t._v("int")]),t._v(" main("),n("strong",[t._v("void")]),t._v(")")]),t._v(" "),n("li",[t._v("{")]),t._v(" "),n("li",[t._v("sub();")]),t._v(" "),n("li",[n("strong",[t._v("return")]),t._v(" 0;")]),t._v(" "),n("li",[t._v("}")]),t._v(" "),n("li",[n("strong",[t._v("static")]),t._v(" "),n("strong",[t._v("void")]),t._v(" sub("),n("strong",[t._v("void")]),t._v(")")]),t._v(" "),n("li",[t._v("{")]),t._v(" "),n("li",[n("strong",[t._v("int")]),t._v(" *p = NULL;")]),t._v(" "),n("li",[t._v("/* derefernce a null pointer, expect coredump. */")]),t._v(" "),n("li",[t._v('printf("%d", *p);')]),t._v(" "),n("li",[t._v("}")])]),t._v(" "),n("h3",{attrs:{id:"_9-2-2-调试过程"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_9-2-2-调试过程"}},[t._v("#")]),t._v(" 9.2.2 调试过程")]),t._v(" "),n("p",[t._v("查看core文件是否开启:")]),t._v(" "),n("p",[n("em",[t._v("root@luo:~/workspace/test/exec\\>ulimit -c")])]),t._v(" "),n("p",[n("em",[t._v("0")])]),t._v(" "),n("p",[t._v("设置core文件大小:")]),t._v(" "),n("p",[n("em",[t._v("root@luo:~/workspace/test/exec\\>ulimit -c 1024")])]),t._v(" "),n("p",[n("em",[t._v("root@luo:~/workspace/test/exec\\>ulimit -c")])]),t._v(" "),n("p",[n("em",[t._v("1024")])]),t._v(" "),n("p",[t._v("查看core文件路径:")]),t._v(" "),n("p",[n("em",[t._v("root@luo:~/workspace/test/exec\\>cat /proc/sys/kernel/core_pattern")])]),t._v(" "),n("p",[n("em",[t._v("/SE/core-%e-%p")])]),t._v(" "),n("p",[n("em",[t._v("root@luo:~/workspace/test/exec\\>ls /SE")])]),t._v(" "),n("p",[n("em",[t._v("ai core--22330 core--4231 log ngtp_agent web_disk")])]),t._v(" "),n("p",[n("em",[t._v("core--21300 core--23374 core--5227 mysql mp.log")])]),t._v(" "),n("p",[t._v("执行程序,生成core文件:")]),t._v(" "),n("p",[n("em",[t._v("root@luo:~/workspace/test/exec\\>./test6")])]),t._v(" "),n("p",[n("em",[t._v("Segmentation fault (core dumped)")])]),t._v(" "),n("p",[t._v("查看是否生成core文件:")]),t._v(" "),n("p",[n("em",[t._v("root@luo:~/workspace/test/exec\\>ls /SE")])]),t._v(" "),n("p",[n("em",[t._v("ai core--23374 core-test6-44938 ngtp_agent")])]),t._v(" "),n("p",[n("em",[t._v("core--21300 core--4231 log mp.log")])]),t._v(" "),n("p",[n("em",[t._v("core--22330 core--5227 mysql web_disk")])]),t._v(" "),n("p",[t._v("使用GDB调试:")]),t._v(" "),n("p",[n("em",[t._v("root@luo:~/workspace/test/exec\\>gdb -q test6 /SE/core-test6-44938")])]),t._v(" "),n("p",[n("em",[t._v("Reading symbols from /home/luo/workspace/test/exec/test6...done.")])]),t._v(" "),n("p",[n("em",[t._v("[New LWP 44938]")])]),t._v(" "),n("p",[n("em",[t._v("Core was generated by `./test6'.")])]),t._v(" "),n("p",[n("em",[t._v("Program terminated with signal 11, Segmentation fault.")])]),t._v(" "),n("p",[n("em",[t._v("#0 0x0000000000400554 in sub () at test6.c:12")])]),t._v(" "),n("p",[n("em",[t._v('12 printf("%d", *p);')])]),t._v(" "),n("p",[n("em",[t._v("(gdb) bt -------------")]),t._v(" 显示栈信息")]),t._v(" "),n("p",[n("em",[t._v("#0 0x0000000000400554 in sub () at test6.c:12")])]),t._v(" "),n("p",[n("em",[t._v("#1 0x0000000000400539 in main () at test6.c:5")])]),t._v(" "),n("p",[n("em",[t._v("(gdb)")])]),t._v(" "),n("p",[t._v("可以看到最后入栈的是sub函数里、位于test6.c文件第12行。所以core dump的问题可能出在这里。")]),t._v(" "),n("h1",{attrs:{id:"_10-gdb调试"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_10-gdb调试"}},[t._v("#")]),t._v(" 10 gdb调试")]),t._v(" "),n("h2",{attrs:{id:"_10-1-命令介绍"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_10-1-命令介绍"}},[t._v("#")]),t._v(" 10.1 命令介绍")]),t._v(" "),n("p",[t._v("gdb脚本基于gdb命令实现,可在虚拟机和设备上直接运行。使用此脚本可批量对多个进程执行给定命令,也可以调试-i指定的非进程。")]),t._v(" "),n("table",[n("thead",[n("tr",[n("th",[t._v("命令")]),t._v(" "),n("th",[t._v("gdb")])])]),t._v(" "),n("tbody",[n("tr",[n("td",[t._v("命令格式")]),t._v(" "),n("td",[t._v("gdb [-s|-p] [-w] [-F 'SEPERATOR'] [-i '_PIDS'] [-e '_PIDS'] -c|-f 'CMD_ARGS'")])]),t._v(" "),n("tr",[n("td",[t._v("参数说明")]),t._v(" "),n("td",[t._v("-s 串行执行CMD(依次对每个执行CMD;默认选项) -p 并行执行CMD(同时对每个执行CMD) -w 等待所有上都执行CMD完毕,否则任意执行完CMD都将停止其他上的执行(仅对-p有效) -i 使用指定的 pids(多个pid以空格分隔),若不指定则自动扫描所有进程 -e 剔除指定的 pids(多个pid以空格分隔) -c 命令列表(多条命令以';'或-F指定的分隔符进行分隔) -f 命令文件(对于带有分支、循环等复杂控制的多条命令,推荐采用命令文件形式) -F 命令列表中的分隔符(默认为';')")])])])]),t._v(" "),n("h2",{attrs:{id:"_10-2-使用示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_10-2-使用示例"}},[t._v("#")]),t._v(" 10.2 使用示例")]),t._v(" "),n("ol",[n("li",[n("p",[t._v("获取mempool状态。(PID应为master或nae的pid)")]),t._v(" "),n("p",[t._v("gdb -c 'call rte_mempool_list_dump(stdout)' -i ")]),t._v(" "),n("p",[t._v("gdb -c 'call cfg_callback_test_coredump(0,0)' -i $pid")]),t._v(" "),n("p",[t._v("gdb -c '' -i $pid")])]),t._v(" "),n("li",[n("p",[t._v("临时在指定位置添加打印函数。")]),t._v(" "),n("p",[t._v("gdb -p -c 'b test.c:45; commands; echo ----will bug_on----\\n; bt; c; end; c'")])]),t._v(" "),n("li",[n("p",[t._v("验证RCU是否执行session释放。")]),t._v(" "),n("p",[t._v("gdb -p -c 'handle all noprint nostop; b _free_mobj if mid==session_mobj; commands; info thread; bt; end; c'")])]),t._v(" "),n("li",[n("p",[t._v("显示所有进程的calltrace信息及本地变量。")]),t._v(" "),n("p",[t._v("说明:对于多、无断点场景下的私有数据、状态,可串行顺序执行。")]),t._v(" "),n("p",[t._v("gdb -c 'bt full'")])]),t._v(" "),n("li",[n("p",[t._v("显示所有进程/线程的calltrace信息。(类似于tdb的info state)")])])]),t._v(" "),n("p",[t._v("说明:对于多、无断点场景下的私有数据、状态,可串行顺序执行。")]),t._v(" "),n("p",[t._v("gdb -c 'thread apply all bt'")]),t._v(" "),n("ol",[n("li",[n("p",[t._v("查看每个进程的私有全局变量engine_id、session_local,并打印CallTrace。")]),t._v(" "),n("p",[t._v("gdb -c 'p engine_id; p/x *session_local; bt'")])]),t._v(" "),n("li",[n("p",[t._v("对指定进程11662,在其neigh.c:1235行的BUG_ON(1)处设置断点,生成core文件。")]),t._v(" "),n("p",[t._v("说明:这种方式生成的core文件不同于由内核生成的/SE/core--PID,它含有共享内存的绝大部分数据,便于深入分析。须注意的是这种core文件一般较大,可能达到几个GB,因此要保证足够的存储空间;存储可能需要十几秒或几十秒。若不指定文件名,则在当前目录下生成名为core.PID的core文件(此时可提前cd到/SE下)。")]),t._v(" "),n("p",[t._v("gdb -c 'b neigh.c:1235; commands; silent; gcore /home/luo/workspace/core-neigh.11662; c; end; c' -i 11662")])]),t._v(" "),n("li",[n("p",[t._v("对指定进程11662,在其ut函数处设置断点,每个报文到来则打印tbuf信息。")])])]),t._v(" "),n("p",[t._v("说明:对单个进程,不存在串行/并行的区别,可按串行处理。")]),t._v(" "),n("p",[t._v("gdb -c 'b ut; commands; silent; p/x *tbuf; c; end; c' -i 11662")]),t._v(" "),n("ol",[n("li",[t._v("打开分片重组部分的调试开关debug_ip4_frag_recv、debug_ip4_mtu_send。")])]),t._v(" "),n("p",[t._v("说明:这两个变量都为共享数据,只需设置单个即可,如pid为11662。")]),t._v(" "),n("p",[t._v("gdb -c 'set debug_ip4_frag_recv=1; set debug_ip4_mtu_send=1; printf \"recv=%d,send=%d\",debug_ip4_frag_recv,debug_ip4_mtu_send' -i 11662")]),t._v(" "),n("ol",[n("li",[t._v("对所有进程设置条件指令断点,触发后执行指定命令,执行命令后继续执行不退出。")])]),t._v(" "),n("p",[t._v("说明:对于涉及多的有断点场景,应使用并行模式。")]),t._v(" "),n("p",[t._v("gdb -p -c 'b test.c:22 if cnt%6==4; commands; silent; echo --trace--\\n; bt; printf \"\\nname=%s cnt=%d\\n\", name, cnt; c; end; c'")]),t._v(" "),n("p",[t._v("该命令序列也可写入命令文件:(-f /tmp/a.gdb)")]),t._v(" "),n("p",[t._v("handle all noprint nostop")]),t._v(" "),n("p",[t._v("b test.c:22 if cnt%6==4")]),t._v(" "),n("p",[t._v("commands")]),t._v(" "),n("p",[t._v("silent")]),t._v(" "),n("p",[t._v("echo --trace--\\n")]),t._v(" "),n("p",[t._v("bt")]),t._v(" "),n("p",[t._v('printf "\\nname=%s cnt=%d\\n", name, cnt')]),t._v(" "),n("p",[t._v("c")]),t._v(" "),n("p",[t._v("end")]),t._v(" "),n("p",[t._v("c")]),t._v(" "),n("p",[t._v("[注]:最后的c命令,使得设完断点及commands后继续运行,倒数第二条c命令,使得断点触发/处理后仍继续运行。")]),t._v(" "),n("ol",[n("li",[n("p",[t._v("对所有进程设置数据断点,当数值被改变时,打印CallTrace。")]),t._v(" "),n("p",[t._v("说明:watch可监控数据是否被改变,rwatch可监控数据是否被读取,awatch包括这两类。")]),t._v(" "),n("p",[t._v("gdb -p -c 'watch st.age; commands; bt; end; c; c'")])]),t._v(" "),n("li",[n("p",[t._v("对每个设置多个断点,每个断点触发时打印CallTrace及文件/函数/行信息。")]),t._v(" "),n("p",[t._v("说明:每个断点对应自己的触发处理,此处采用了自定义命令hit_me的方式。")]),t._v(" "),n("p",[t._v("gdb -p -f /tmp/b.gdb")]),t._v(" "),n("p",[t._v("handle all noprint nostop")]),t._v(" "),n("p",[t._v("define hit_me")]),t._v(" "),n("p",[t._v("echo \\n>>>hit_me>>>\\n")]),t._v(" "),n("p",[t._v("bt")]),t._v(" "),n("p",[t._v("info thread")]),t._v(" "),n("p",[t._v("end")]),t._v(" "),n("p",[t._v("b test.c:24")]),t._v(" "),n("p",[t._v("commands")]),t._v(" "),n("p",[t._v("hit_me")]),t._v(" "),n("p",[t._v("c")]),t._v(" "),n("p",[t._v("end")]),t._v(" "),n("p",[t._v("b test.c:36")]),t._v(" "),n("p",[t._v("commands")]),t._v(" "),n("p",[t._v("hit_me")]),t._v(" "),n("p",[t._v("c")]),t._v(" "),n("p",[t._v("end")]),t._v(" "),n("p",[t._v("c")])]),t._v(" "),n("li",[n("p",[t._v("查看phy_dev[]中ifindex为26的结构体。")]),t._v(" "),n("p",[t._v("说明:phy_dev为共享数据,因此只需查看单个即可,如pid为11662。命令序列略繁,可写入命令文件。")]),t._v(" "),n("p",[t._v("gdb -f /tmp/dev.gdb -i 11662")]),t._v(" "),n("p",[t._v("脚本/tmp/dev.gdb内容如下:")]),t._v(" "),n("p",[t._v("handle all noprint nostop")]),t._v(" "),n("p",[t._v("set print pretty")]),t._v(" "),n("p",[t._v("set $idx=26")]),t._v(" "),n("p",[t._v("set $i=0")]),t._v(" "),n("p",[t._v("while ($i<256)")]),t._v(" "),n("p",[t._v("set $d = (struct dev*)phy_dev[$i]")]),t._v(" "),n("p",[t._v("if ($d == 0)")]),t._v(" "),n("p",[t._v("loop_break")]),t._v(" "),n("p",[t._v("end")]),t._v(" "),n("p",[t._v("if ($d->ifindex==$idx)")]),t._v(" "),n("p",[t._v("p/x *$d")]),t._v(" "),n("p",[t._v("loop_break")]),t._v(" "),n("p",[t._v("end")]),t._v(" "),n("p",[t._v("set $i = $i+1")]),t._v(" "),n("p",[t._v("end")])]),t._v(" "),n("li",[n("p",[t._v("查看挂接在链表mirror_filter_list上的每个filter节点。")])])]),t._v(" "),n("p",[t._v("说明:mirror_filter_list为共享数据,因此只需查看单个即可,如pid为11662。")]),t._v(" "),n("p",[t._v("gdb -f /tmp/mirror_filter.gdb -i 11662")]),t._v(" "),n("p",[t._v("脚本mirror_filter.gdb内容如下:")]),t._v(" "),n("p",[t._v("handle all noprint nostop")]),t._v(" "),n("p",[t._v("set print pretty")]),t._v(" "),n("p",[t._v("p/x &mirror_filter_list")]),t._v(" "),n("p",[t._v("set $f=mirror_filter_list.next")]),t._v(" "),n("p",[t._v("while (1)")]),t._v(" "),n("p",[t._v("if ($f==&mirror_filter_list)")]),t._v(" "),n("p",[t._v("echo [end of list]")]),t._v(" "),n("p",[t._v("loop_break")]),t._v(" "),n("p",[t._v("end")]),t._v(" "),n("p",[t._v("p/x *(struct mirror_filter_t*)$f")]),t._v(" "),n("p",[t._v("set $f=((struct list_head*)$f)->next")]),t._v(" "),n("p",[t._v("end")]),t._v(" "),n("ol",[n("li",[n("p",[t._v("获取进程core大小限制。")]),t._v(" "),n("p",[t._v("gdb -c 'p getrlimit(4,$rsp-32); x/2xg $rsp-32'")])])])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/14.21bcebc4.js b/assets/js/14.21bcebc4.js new file mode 100644 index 0000000..fc97f38 --- /dev/null +++ b/assets/js/14.21bcebc4.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[14],{596:function(s,t,a){"use strict";a.r(t);var n=a(15),e=Object(n.a)({},(function(){var s=this,t=s.$createElement,a=s._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[a("h1",{attrs:{id:"mutex、读写锁、自旋锁、信号量以及rcu的性能测试"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#mutex、读写锁、自旋锁、信号量以及rcu的性能测试"}},[s._v("#")]),s._v(" mutex、读写锁、自旋锁、信号量以及RCU的性能测试")]),s._v(" "),a("h2",{attrs:{id:"前言"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#前言"}},[s._v("#")]),s._v(" 前言")]),s._v(" "),a("blockquote",[a("p",[s._v("本例为一个读线程和一个写线程,在不同加锁情况下测试一秒钟读写次数\n没有测试多线程情况,结果只有参考意义\n读写次数还与cpu频率相关 但大致不同种类的锁性能比较差距不大\n测试源码和过程在最下面")])]),s._v(" "),a("h2",{attrs:{id:"一、直接上结论"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#一、直接上结论"}},[s._v("#")]),s._v(" 一、直接上结论")]),s._v(" "),a("h3",{attrs:{id:"_1、以下为每秒读写次数"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_1、以下为每秒读写次数"}},[s._v("#")]),s._v(" 1、以下为每秒读写次数")]),s._v(" "),a("blockquote",[a("p",[s._v("次数与cpu频率相关,不同机器测试结果不同(这里使用ubuntu20.04虚拟机测试的)")])]),s._v(" "),a("p",[s._v("读写锁\t21000k")]),s._v(" "),a("p",[s._v("mutex\t31000k")]),s._v(" "),a("p",[s._v("自旋锁\t58000k")]),s._v(" "),a("p",[s._v("信号量 27000k")]),s._v(" "),a("p",[s._v("rcu\t\t47000k")]),s._v(" "),a("h3",{attrs:{id:"_2、锁的特点和使用场景"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_2、锁的特点和使用场景"}},[s._v("#")]),s._v(" 2、锁的特点和使用场景")]),s._v(" "),a("p",[s._v("自旋锁特点 循环等待等 力度很小 用于链表头指针改变等情况")]),s._v(" "),a("p",[s._v("mutex 加锁时线程休眠一会看一下 可用于大部分情况")]),s._v(" "),a("p",[s._v("读写锁 读写都要判断 加锁复杂 不推荐使用")]),s._v(" "),a("p",[s._v("信号量 pv操作 比mutex低一点")]),s._v(" "),a("p",[s._v("rcu 读写锁变种 read copy update 可以代替读写锁情况")]),s._v(" "),a("h2",{attrs:{id:"二、环境准备"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#二、环境准备"}},[s._v("#")]),s._v(" 二、环境准备")]),s._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",[a("code",[s._v("编译命令\n")])])]),a("div",{staticClass:"language-sh line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sh"}},[a("code",[s._v(" gcc -o rcu rcu.c -lpthread -lurcu\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("div",{staticClass:"language- extra-class"},[a("pre",[a("code",[s._v("rcu锁需要安装liburcu-dev\n")])])]),a("div",{staticClass:"language-sh line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sh"}},[a("code",[s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("apt-get")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" liburcu-dev\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("h2",{attrs:{id:"三、实际测试结果"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#三、实际测试结果"}},[s._v("#")]),s._v(" 三、实际测试结果")]),s._v(" "),a("p",[s._v("不加锁")]),s._v(" "),a("div",{staticClass:"language-sh line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sh"}},[a("code",[s._v("root@luo:~/workspace/test"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# ./rcu ")]),s._v("\nError: x:2340421, y:3524383\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("p",[s._v("读写锁")]),s._v(" "),a("div",{staticClass:"language-sh line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sh"}},[a("code",[s._v("root@luo:~/workspace/test"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# ./rcu ")]),s._v("\nreads: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("19500709")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("19500")]),s._v(" K reads/sec\nreads: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("44758029")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("22379")]),s._v(" K reads/sec\nreads: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("65393430")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("21797")]),s._v(" K reads/sec\nreads: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("85189522")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("21297")]),s._v(" K reads/sec\n\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br")])]),a("p",[s._v("信号量")]),s._v(" "),a("div",{staticClass:"language-sh line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sh"}},[a("code",[s._v("root@luo:~/workspace/test"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# ./rcu ")]),s._v("\nreads: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("27627678")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("27627")]),s._v(" K reads/sec\nreads: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("55094966")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("27547")]),s._v(" K reads/sec\nreads: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("82395410")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("27465")]),s._v(" K reads/sec\nreads: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("109609817")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("27402")]),s._v(" K reads/sec\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br")])]),a("p",[s._v("mutex")]),s._v(" "),a("div",{staticClass:"language-sh line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sh"}},[a("code",[s._v("root@luo:~/workspace/test"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# ./rcu ")]),s._v("\nreads: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("32018261")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("32018")]),s._v(" K reads/sec\nreads: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("63767452")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("31883")]),s._v(" K reads/sec\nreads: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("95838658")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("31946")]),s._v(" K reads/sec\nreads: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("127792109")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("31948")]),s._v(" K reads/sec\n\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br")])]),a("p",[s._v("自旋锁")]),s._v(" "),a("div",{staticClass:"language-sh line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sh"}},[a("code",[s._v("root@luo:~/workspace/test"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# ./rcu ")]),s._v("\nreads: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("57844075")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("57844")]),s._v(" K reads/sec\nreads: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("117047083")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("58523")]),s._v(" K reads/sec\nreads: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("173215973")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("57738")]),s._v(" K reads/sec\nreads: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("229239811")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("57309")]),s._v(" K reads/sec\n\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br")])]),a("p",[s._v("RCU")]),s._v(" "),a("div",{staticClass:"language-sh line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sh"}},[a("code",[s._v("root@luo:~/workspace/test"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# ./rcu ")]),s._v("\nreads: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("47511136")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("47511")]),s._v(" K reads/sec\nreads: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("94736084")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("47368")]),s._v(" K reads/sec\nreads: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("141648406")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("47216")]),s._v(" K reads/sec\nreads: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("188779939")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("47194")]),s._v(" K reads/sec\n\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br")])]),a("h2",{attrs:{id:"四、-源码"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#四、-源码"}},[s._v("#")]),s._v(" 四、 源码")]),s._v(" "),a("p",[s._v("rcu.c")]),s._v(" "),a("div",{staticClass:"language-c line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-c"}},[a("code",[a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("include")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("include")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("include")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("")])]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("include")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("include")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("")])]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("include")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("")])]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("include")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("")])]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("point")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" y"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("point")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("gp"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" done "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("long")]),s._v(" reads "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n\n"),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("pthread_rwlock_t")]),s._v(" rwlock"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("pthread_mutex_t")]),s._v(" mutex"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("pthread_spinlock_t")]),s._v(" spinlock"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("sem_t")]),s._v(" sem"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("timer")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("arg"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("timespec")]),s._v(" ts"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" ts2"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("timespec_get")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("ts"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" TIME_UTC"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!")]),s._v("done"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n\t\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("sleep")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("timespec_get")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("ts2"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" TIME_UTC"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n\t\t"),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("time_t")]),s._v(" sec "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" ts2"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("tv_sec "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("-")]),s._v(" ts"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("tv_sec"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n\t\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("printf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"reads: %ld, %ld K reads/sec\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" reads"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("reads"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v("sec"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1000")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("updater")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("arg"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("point")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("p"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("point")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("old"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" INT_MAX"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n\t\tp "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("malloc")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("sizeof")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("point")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n\t\tp"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("x "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\tp"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("y "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" i"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n\t\told "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" gp"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token expression"}},[a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")])])]),s._v("\n\t\tgp "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" p"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("elif")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token expression"}},[a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")])])]),s._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("pthread_rwlock_wrlock")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("rwlock"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\tgp "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" p"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("pthread_rwlock_unlock")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("rwlock"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("elif")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token expression"}},[a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")])])]),s._v("\n\n\t\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("pthread_mutex_lock")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("mutex"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\tgp "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" p"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("pthread_mutex_unlock")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("mutex"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("elif")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token expression"}},[a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")])])]),s._v("\n\n\t\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("pthread_spin_lock")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("spinlock"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\tgp "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" p"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("pthread_spin_unlock")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("spinlock"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("elif")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token expression"}},[a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")])])]),s._v("\n\n\t\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("rcu_assign_pointer")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("gp"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" p"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("synchronize_rcu")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("else")])]),s._v("\n\n\t\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("sem_wait")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("sem"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\tgp "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" p"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("sem_post")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("sem"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("endif")])]),s._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("free")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("old"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\t\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("reader")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("arg"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("rcu_register_thread")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//urcu")]),s._v("\n\n\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!")]),s._v("done"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n\t\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" y"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token expression"}},[a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")])])]),s._v("\n\t\tx "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" gp"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\ty "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" gp"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("y"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("elif")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token expression"}},[a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")])])]),s._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("pthread_rwlock_rdlock")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("rwlock"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\tx "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" gp"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\ty "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" gp"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("y"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("pthread_rwlock_unlock")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("rwlock"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("elif")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token expression"}},[a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")])])]),s._v("\n\n\t\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("pthread_mutex_lock")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("mutex"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\tx "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" gp"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\ty "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" gp"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("y"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("pthread_mutex_unlock")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("mutex"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("elif")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token expression"}},[a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")])])]),s._v("\n\n\t\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("pthread_spin_lock")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("spinlock"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\tx "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" gp"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\ty "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" gp"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("y"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("pthread_spin_unlock")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("spinlock"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("elif")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token expression"}},[a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")])])]),s._v("\n\n\t\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("rcu_read_lock")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n\t\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("point")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("p "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("rcu_dereference")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("gp"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\tx "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" p"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\ty "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" p"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("y"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n\t\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("rcu_read_unlock")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("else")])]),s._v("\n\n\t\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("sem_wait")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("sem"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\tx "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" gp"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\ty "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" gp"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("y"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("sem_post")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("sem"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("endif")])]),s._v("\n\t\treads "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n\t\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("y "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!=")]),s._v(" x"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("+")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\t\t\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("printf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"Error: x:%d, y:%d\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" y"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\t\tdone "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\t\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("break")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("rcu_unregister_thread")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("exit")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("main")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n\t"),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("pthread_t")]),s._v(" tid"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("pthread_rwlock_init")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("rwlock"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("pthread_mutex_init")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("mutex"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("pthread_spin_init")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("spinlock"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" PTHREAD_PROCESS_SHARED"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("sem_init")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("sem"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("rcu_init")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// rcu ")]),s._v("\n\n\tgp "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("malloc")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("sizeof")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("struct")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("point")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\tgp"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("x "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\tgp"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("y "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("pthread_create")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("tid"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" updater"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("pthread_create")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("tid"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" reader"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("pthread_create")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("tid"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" timer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("pthread_join")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("tid"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("i"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[s._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n\t"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("free")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("gp"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br"),a("span",{staticClass:"line-number"},[s._v("20")]),a("br"),a("span",{staticClass:"line-number"},[s._v("21")]),a("br"),a("span",{staticClass:"line-number"},[s._v("22")]),a("br"),a("span",{staticClass:"line-number"},[s._v("23")]),a("br"),a("span",{staticClass:"line-number"},[s._v("24")]),a("br"),a("span",{staticClass:"line-number"},[s._v("25")]),a("br"),a("span",{staticClass:"line-number"},[s._v("26")]),a("br"),a("span",{staticClass:"line-number"},[s._v("27")]),a("br"),a("span",{staticClass:"line-number"},[s._v("28")]),a("br"),a("span",{staticClass:"line-number"},[s._v("29")]),a("br"),a("span",{staticClass:"line-number"},[s._v("30")]),a("br"),a("span",{staticClass:"line-number"},[s._v("31")]),a("br"),a("span",{staticClass:"line-number"},[s._v("32")]),a("br"),a("span",{staticClass:"line-number"},[s._v("33")]),a("br"),a("span",{staticClass:"line-number"},[s._v("34")]),a("br"),a("span",{staticClass:"line-number"},[s._v("35")]),a("br"),a("span",{staticClass:"line-number"},[s._v("36")]),a("br"),a("span",{staticClass:"line-number"},[s._v("37")]),a("br"),a("span",{staticClass:"line-number"},[s._v("38")]),a("br"),a("span",{staticClass:"line-number"},[s._v("39")]),a("br"),a("span",{staticClass:"line-number"},[s._v("40")]),a("br"),a("span",{staticClass:"line-number"},[s._v("41")]),a("br"),a("span",{staticClass:"line-number"},[s._v("42")]),a("br"),a("span",{staticClass:"line-number"},[s._v("43")]),a("br"),a("span",{staticClass:"line-number"},[s._v("44")]),a("br"),a("span",{staticClass:"line-number"},[s._v("45")]),a("br"),a("span",{staticClass:"line-number"},[s._v("46")]),a("br"),a("span",{staticClass:"line-number"},[s._v("47")]),a("br"),a("span",{staticClass:"line-number"},[s._v("48")]),a("br"),a("span",{staticClass:"line-number"},[s._v("49")]),a("br"),a("span",{staticClass:"line-number"},[s._v("50")]),a("br"),a("span",{staticClass:"line-number"},[s._v("51")]),a("br"),a("span",{staticClass:"line-number"},[s._v("52")]),a("br"),a("span",{staticClass:"line-number"},[s._v("53")]),a("br"),a("span",{staticClass:"line-number"},[s._v("54")]),a("br"),a("span",{staticClass:"line-number"},[s._v("55")]),a("br"),a("span",{staticClass:"line-number"},[s._v("56")]),a("br"),a("span",{staticClass:"line-number"},[s._v("57")]),a("br"),a("span",{staticClass:"line-number"},[s._v("58")]),a("br"),a("span",{staticClass:"line-number"},[s._v("59")]),a("br"),a("span",{staticClass:"line-number"},[s._v("60")]),a("br"),a("span",{staticClass:"line-number"},[s._v("61")]),a("br"),a("span",{staticClass:"line-number"},[s._v("62")]),a("br"),a("span",{staticClass:"line-number"},[s._v("63")]),a("br"),a("span",{staticClass:"line-number"},[s._v("64")]),a("br"),a("span",{staticClass:"line-number"},[s._v("65")]),a("br"),a("span",{staticClass:"line-number"},[s._v("66")]),a("br"),a("span",{staticClass:"line-number"},[s._v("67")]),a("br"),a("span",{staticClass:"line-number"},[s._v("68")]),a("br"),a("span",{staticClass:"line-number"},[s._v("69")]),a("br"),a("span",{staticClass:"line-number"},[s._v("70")]),a("br"),a("span",{staticClass:"line-number"},[s._v("71")]),a("br"),a("span",{staticClass:"line-number"},[s._v("72")]),a("br"),a("span",{staticClass:"line-number"},[s._v("73")]),a("br"),a("span",{staticClass:"line-number"},[s._v("74")]),a("br"),a("span",{staticClass:"line-number"},[s._v("75")]),a("br"),a("span",{staticClass:"line-number"},[s._v("76")]),a("br"),a("span",{staticClass:"line-number"},[s._v("77")]),a("br"),a("span",{staticClass:"line-number"},[s._v("78")]),a("br"),a("span",{staticClass:"line-number"},[s._v("79")]),a("br"),a("span",{staticClass:"line-number"},[s._v("80")]),a("br"),a("span",{staticClass:"line-number"},[s._v("81")]),a("br"),a("span",{staticClass:"line-number"},[s._v("82")]),a("br"),a("span",{staticClass:"line-number"},[s._v("83")]),a("br"),a("span",{staticClass:"line-number"},[s._v("84")]),a("br"),a("span",{staticClass:"line-number"},[s._v("85")]),a("br"),a("span",{staticClass:"line-number"},[s._v("86")]),a("br"),a("span",{staticClass:"line-number"},[s._v("87")]),a("br"),a("span",{staticClass:"line-number"},[s._v("88")]),a("br"),a("span",{staticClass:"line-number"},[s._v("89")]),a("br"),a("span",{staticClass:"line-number"},[s._v("90")]),a("br"),a("span",{staticClass:"line-number"},[s._v("91")]),a("br"),a("span",{staticClass:"line-number"},[s._v("92")]),a("br"),a("span",{staticClass:"line-number"},[s._v("93")]),a("br"),a("span",{staticClass:"line-number"},[s._v("94")]),a("br"),a("span",{staticClass:"line-number"},[s._v("95")]),a("br"),a("span",{staticClass:"line-number"},[s._v("96")]),a("br"),a("span",{staticClass:"line-number"},[s._v("97")]),a("br"),a("span",{staticClass:"line-number"},[s._v("98")]),a("br"),a("span",{staticClass:"line-number"},[s._v("99")]),a("br"),a("span",{staticClass:"line-number"},[s._v("100")]),a("br"),a("span",{staticClass:"line-number"},[s._v("101")]),a("br"),a("span",{staticClass:"line-number"},[s._v("102")]),a("br"),a("span",{staticClass:"line-number"},[s._v("103")]),a("br"),a("span",{staticClass:"line-number"},[s._v("104")]),a("br"),a("span",{staticClass:"line-number"},[s._v("105")]),a("br"),a("span",{staticClass:"line-number"},[s._v("106")]),a("br"),a("span",{staticClass:"line-number"},[s._v("107")]),a("br"),a("span",{staticClass:"line-number"},[s._v("108")]),a("br"),a("span",{staticClass:"line-number"},[s._v("109")]),a("br"),a("span",{staticClass:"line-number"},[s._v("110")]),a("br"),a("span",{staticClass:"line-number"},[s._v("111")]),a("br"),a("span",{staticClass:"line-number"},[s._v("112")]),a("br"),a("span",{staticClass:"line-number"},[s._v("113")]),a("br"),a("span",{staticClass:"line-number"},[s._v("114")]),a("br"),a("span",{staticClass:"line-number"},[s._v("115")]),a("br"),a("span",{staticClass:"line-number"},[s._v("116")]),a("br"),a("span",{staticClass:"line-number"},[s._v("117")]),a("br"),a("span",{staticClass:"line-number"},[s._v("118")]),a("br"),a("span",{staticClass:"line-number"},[s._v("119")]),a("br"),a("span",{staticClass:"line-number"},[s._v("120")]),a("br"),a("span",{staticClass:"line-number"},[s._v("121")]),a("br"),a("span",{staticClass:"line-number"},[s._v("122")]),a("br"),a("span",{staticClass:"line-number"},[s._v("123")]),a("br"),a("span",{staticClass:"line-number"},[s._v("124")]),a("br"),a("span",{staticClass:"line-number"},[s._v("125")]),a("br"),a("span",{staticClass:"line-number"},[s._v("126")]),a("br"),a("span",{staticClass:"line-number"},[s._v("127")]),a("br"),a("span",{staticClass:"line-number"},[s._v("128")]),a("br"),a("span",{staticClass:"line-number"},[s._v("129")]),a("br"),a("span",{staticClass:"line-number"},[s._v("130")]),a("br"),a("span",{staticClass:"line-number"},[s._v("131")]),a("br"),a("span",{staticClass:"line-number"},[s._v("132")]),a("br"),a("span",{staticClass:"line-number"},[s._v("133")]),a("br"),a("span",{staticClass:"line-number"},[s._v("134")]),a("br"),a("span",{staticClass:"line-number"},[s._v("135")]),a("br"),a("span",{staticClass:"line-number"},[s._v("136")]),a("br"),a("span",{staticClass:"line-number"},[s._v("137")]),a("br"),a("span",{staticClass:"line-number"},[s._v("138")]),a("br"),a("span",{staticClass:"line-number"},[s._v("139")]),a("br"),a("span",{staticClass:"line-number"},[s._v("140")]),a("br"),a("span",{staticClass:"line-number"},[s._v("141")]),a("br"),a("span",{staticClass:"line-number"},[s._v("142")]),a("br"),a("span",{staticClass:"line-number"},[s._v("143")]),a("br"),a("span",{staticClass:"line-number"},[s._v("144")]),a("br"),a("span",{staticClass:"line-number"},[s._v("145")]),a("br"),a("span",{staticClass:"line-number"},[s._v("146")]),a("br"),a("span",{staticClass:"line-number"},[s._v("147")]),a("br"),a("span",{staticClass:"line-number"},[s._v("148")]),a("br"),a("span",{staticClass:"line-number"},[s._v("149")]),a("br"),a("span",{staticClass:"line-number"},[s._v("150")]),a("br"),a("span",{staticClass:"line-number"},[s._v("151")]),a("br"),a("span",{staticClass:"line-number"},[s._v("152")]),a("br"),a("span",{staticClass:"line-number"},[s._v("153")]),a("br"),a("span",{staticClass:"line-number"},[s._v("154")]),a("br"),a("span",{staticClass:"line-number"},[s._v("155")]),a("br"),a("span",{staticClass:"line-number"},[s._v("156")]),a("br"),a("span",{staticClass:"line-number"},[s._v("157")]),a("br"),a("span",{staticClass:"line-number"},[s._v("158")]),a("br"),a("span",{staticClass:"line-number"},[s._v("159")]),a("br"),a("span",{staticClass:"line-number"},[s._v("160")]),a("br"),a("span",{staticClass:"line-number"},[s._v("161")]),a("br"),a("span",{staticClass:"line-number"},[s._v("162")]),a("br"),a("span",{staticClass:"line-number"},[s._v("163")]),a("br"),a("span",{staticClass:"line-number"},[s._v("164")]),a("br"),a("span",{staticClass:"line-number"},[s._v("165")]),a("br"),a("span",{staticClass:"line-number"},[s._v("166")]),a("br"),a("span",{staticClass:"line-number"},[s._v("167")]),a("br"),a("span",{staticClass:"line-number"},[s._v("168")]),a("br"),a("span",{staticClass:"line-number"},[s._v("169")]),a("br"),a("span",{staticClass:"line-number"},[s._v("170")]),a("br"),a("span",{staticClass:"line-number"},[s._v("171")]),a("br"),a("span",{staticClass:"line-number"},[s._v("172")]),a("br"),a("span",{staticClass:"line-number"},[s._v("173")]),a("br"),a("span",{staticClass:"line-number"},[s._v("174")]),a("br"),a("span",{staticClass:"line-number"},[s._v("175")]),a("br"),a("span",{staticClass:"line-number"},[s._v("176")]),a("br"),a("span",{staticClass:"line-number"},[s._v("177")]),a("br"),a("span",{staticClass:"line-number"},[s._v("178")]),a("br"),a("span",{staticClass:"line-number"},[s._v("179")]),a("br"),a("span",{staticClass:"line-number"},[s._v("180")]),a("br"),a("span",{staticClass:"line-number"},[s._v("181")]),a("br"),a("span",{staticClass:"line-number"},[s._v("182")]),a("br"),a("span",{staticClass:"line-number"},[s._v("183")]),a("br"),a("span",{staticClass:"line-number"},[s._v("184")]),a("br"),a("span",{staticClass:"line-number"},[s._v("185")]),a("br"),a("span",{staticClass:"line-number"},[s._v("186")]),a("br"),a("span",{staticClass:"line-number"},[s._v("187")]),a("br")])])])}),[],!1,null,null,null);t.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/15.cc9f2f8e.js b/assets/js/15.cc9f2f8e.js new file mode 100644 index 0000000..9e963ac --- /dev/null +++ b/assets/js/15.cc9f2f8e.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[15],{597:function(s,a,t){"use strict";t.r(a);var n=t(15),e=Object(n.a)({},(function(){var s=this,a=s.$createElement,t=s._self._c||a;return t("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[t("h2",{attrs:{id:"方法"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#方法"}},[s._v("#")]),s._v(" 方法")]),s._v(" "),t("p",[s._v("循环分配10000个类对象 然后查看内存空间源码在最下面")]),s._v(" "),t("p",[s._v("对c++类的虚函数有基本了解")]),s._v(" "),t("h2",{attrs:{id:"编译命令"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#编译命令"}},[s._v("#")]),s._v(" 编译命令")]),s._v(" "),t("div",{staticClass:"language- line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[s._v("g++ -o memtest memtest.cpp -g -O0\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br")])]),t("h2",{attrs:{id:"直接开始"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#直接开始"}},[s._v("#")]),s._v(" 直接开始")]),s._v(" "),t("div",{staticClass:"language- line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[s._v("@luo:~/workspace/memtest# gdb memtest <----------------------- 使用gdb 调试memtest\nGNU gdb (Ubuntu 9.2-0ubuntu1~20.04.1) 9.2\n...\n...\nReading symbols from memtest...\n(gdb) r <------------------------------------------------------开始运行\nStarting program: /root/workspace/memtest/memtest \nterminate called after throwing an instance of 'std::bad_alloc'\n what(): std::bad_alloc\n\nProgram received signal SIGABRT, Aborted.\n__GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50\n50\t../sysdeps/unix/sysv/linux/raise.c: No such file or directory.\n(gdb) info proc <---------------------------------------------查看当前进程信息\nprocess 2132 <------------------------------------------------ 当前进程pid\ncmdline = '/root/workspace/memtest/memtest'\ncwd = '/root/workspace/memtest'\nexe = '/root/workspace/memtest/memtest'\n(gdb) shell pmap -x 2132 <------------------------------------ 使用pmap查看内存映射\n2132: /root/workspace/memtest/memtest\nAddress Kbytes RSS Dirty Mode Mapping\n0000555555554000 4 4 4 r---- memtest\n0000555555555000 4 4 4 r-x-- memtest\n0000555555556000 4 4 0 r---- memtest\n0000555555557000 4 4 4 r---- memtest\n0000555555558000 4 4 4 rw--- memtest\n0000555555559000 396 324 324 rw--- [ anon ] <------堆内存地址\n00007ffff7a7d000 16 16 16 rw--- [ anon ]\n00007ffff7a81000 12 12 0 r---- libgcc_s.so.1\n00007ffff7a84000 72 72 0 r-x-- libgcc_s.so.1\n00007ffff7a96000 16 16 0 r---- libgcc_s.so.1\n00007ffff7a9a000 4 4 4 r---- libgcc_s.so.1\n00007ffff7a9b000 4 4 4 rw--- libgcc_s.so.1\n00007ffff7a9c000 52 52 0 r---- libm-2.31.so\n00007ffff7aa9000 668 256 0 r-x-- libm-2.31.so\n00007ffff7b50000 612 0 0 r---- libm-2.31.so\n00007ffff7be9000 4 4 4 r---- libm-2.31.so\n00007ffff7bea000 4 4 4 rw--- libm-2.31.so\n00007ffff7beb000 136 136 0 r---- libc-2.31.so\n00007ffff7c0d000 1504 848 8 r-x-- libc-2.31.so\n00007ffff7d85000 312 172 0 r---- libc-2.31.so\n00007ffff7dd3000 16 16 16 r---- libc-2.31.so\n00007ffff7dd7000 8 8 8 rw--- libc-2.31.so\n00007ffff7dd9000 16 12 12 rw--- [ anon ]\n00007ffff7ddd000 600 600 0 r---- libstdc++.so.6.0.28\n00007ffff7e73000 964 628 4 r-x-- libstdc++.so.6.0.28\n00007ffff7f64000 292 164 0 r---- libstdc++.so.6.0.28\n00007ffff7fad000 4 0 0 ----- libstdc++.so.6.0.28\n00007ffff7fae000 44 44 44 r---- libstdc++.so.6.0.28\n00007ffff7fb9000 12 12 12 rw--- libstdc++.so.6.0.28\n00007ffff7fbc000 20 20 20 rw--- [ anon ]\n00007ffff7fcb000 12 0 0 r---- [ anon ]\n00007ffff7fce000 4 4 4 r-x-- [ anon ]\n00007ffff7fcf000 4 4 0 r---- ld-2.31.so\n00007ffff7fd0000 140 140 24 r-x-- ld-2.31.so\n00007ffff7ff3000 32 32 0 r---- ld-2.31.so\n00007ffff7ffc000 4 4 4 r---- ld-2.31.so\n00007ffff7ffd000 4 4 4 rw--- ld-2.31.so\n00007ffff7ffe000 4 4 4 rw--- [ anon ]\n00007ffffffde000 132 12 12 rw--- [ stack ]\nffffffffff600000 4 0 0 --x-- [ anon ]\n---------------- ------- ------- ------- \ntotal kB 6148 3648 548\n\t\t\t\t\t\t\t\t\t\t\t\t\t计算方法 396*1024/8=50688\n(gdb) x/50688a 0x0000555555559000 <----------------------- 查看堆内存地址数据\n0x555555559000:\t0x0\t0x291\n...\n...\n0x55555556aea0:\t0x0\t0x21\n0x55555556aeb0:\t0x555555557cd0 <_ZTV7MEMTEST+16>\t0xbb114514aa114514\n0x55555556aec0:\t0x0\t0x21\n0x55555556aed0:\t0x555555557cd0 <_ZTV7MEMTEST+16>\t0xbb114514aa114514\n0x55555556aee0:\t0x0\t0x21\n0x55555556aef0:\t0x555555557cd0 <_ZTV7MEMTEST+16>\t0xbb114514aa114514\n0x55555556af00:\t0x0\t0x21\n0x55555556af10:\t0x555555557cd0 <_ZTV7MEMTEST+16>\t0xbb114514aa114514\n...\n\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br"),t("span",{staticClass:"line-number"},[s._v("15")]),t("br"),t("span",{staticClass:"line-number"},[s._v("16")]),t("br"),t("span",{staticClass:"line-number"},[s._v("17")]),t("br"),t("span",{staticClass:"line-number"},[s._v("18")]),t("br"),t("span",{staticClass:"line-number"},[s._v("19")]),t("br"),t("span",{staticClass:"line-number"},[s._v("20")]),t("br"),t("span",{staticClass:"line-number"},[s._v("21")]),t("br"),t("span",{staticClass:"line-number"},[s._v("22")]),t("br"),t("span",{staticClass:"line-number"},[s._v("23")]),t("br"),t("span",{staticClass:"line-number"},[s._v("24")]),t("br"),t("span",{staticClass:"line-number"},[s._v("25")]),t("br"),t("span",{staticClass:"line-number"},[s._v("26")]),t("br"),t("span",{staticClass:"line-number"},[s._v("27")]),t("br"),t("span",{staticClass:"line-number"},[s._v("28")]),t("br"),t("span",{staticClass:"line-number"},[s._v("29")]),t("br"),t("span",{staticClass:"line-number"},[s._v("30")]),t("br"),t("span",{staticClass:"line-number"},[s._v("31")]),t("br"),t("span",{staticClass:"line-number"},[s._v("32")]),t("br"),t("span",{staticClass:"line-number"},[s._v("33")]),t("br"),t("span",{staticClass:"line-number"},[s._v("34")]),t("br"),t("span",{staticClass:"line-number"},[s._v("35")]),t("br"),t("span",{staticClass:"line-number"},[s._v("36")]),t("br"),t("span",{staticClass:"line-number"},[s._v("37")]),t("br"),t("span",{staticClass:"line-number"},[s._v("38")]),t("br"),t("span",{staticClass:"line-number"},[s._v("39")]),t("br"),t("span",{staticClass:"line-number"},[s._v("40")]),t("br"),t("span",{staticClass:"line-number"},[s._v("41")]),t("br"),t("span",{staticClass:"line-number"},[s._v("42")]),t("br"),t("span",{staticClass:"line-number"},[s._v("43")]),t("br"),t("span",{staticClass:"line-number"},[s._v("44")]),t("br"),t("span",{staticClass:"line-number"},[s._v("45")]),t("br"),t("span",{staticClass:"line-number"},[s._v("46")]),t("br"),t("span",{staticClass:"line-number"},[s._v("47")]),t("br"),t("span",{staticClass:"line-number"},[s._v("48")]),t("br"),t("span",{staticClass:"line-number"},[s._v("49")]),t("br"),t("span",{staticClass:"line-number"},[s._v("50")]),t("br"),t("span",{staticClass:"line-number"},[s._v("51")]),t("br"),t("span",{staticClass:"line-number"},[s._v("52")]),t("br"),t("span",{staticClass:"line-number"},[s._v("53")]),t("br"),t("span",{staticClass:"line-number"},[s._v("54")]),t("br"),t("span",{staticClass:"line-number"},[s._v("55")]),t("br"),t("span",{staticClass:"line-number"},[s._v("56")]),t("br"),t("span",{staticClass:"line-number"},[s._v("57")]),t("br"),t("span",{staticClass:"line-number"},[s._v("58")]),t("br"),t("span",{staticClass:"line-number"},[s._v("59")]),t("br"),t("span",{staticClass:"line-number"},[s._v("60")]),t("br"),t("span",{staticClass:"line-number"},[s._v("61")]),t("br"),t("span",{staticClass:"line-number"},[s._v("62")]),t("br"),t("span",{staticClass:"line-number"},[s._v("63")]),t("br"),t("span",{staticClass:"line-number"},[s._v("64")]),t("br"),t("span",{staticClass:"line-number"},[s._v("65")]),t("br"),t("span",{staticClass:"line-number"},[s._v("66")]),t("br"),t("span",{staticClass:"line-number"},[s._v("67")]),t("br"),t("span",{staticClass:"line-number"},[s._v("68")]),t("br"),t("span",{staticClass:"line-number"},[s._v("69")]),t("br"),t("span",{staticClass:"line-number"},[s._v("70")]),t("br"),t("span",{staticClass:"line-number"},[s._v("71")]),t("br"),t("span",{staticClass:"line-number"},[s._v("72")]),t("br"),t("span",{staticClass:"line-number"},[s._v("73")]),t("br"),t("span",{staticClass:"line-number"},[s._v("74")]),t("br"),t("span",{staticClass:"line-number"},[s._v("75")]),t("br"),t("span",{staticClass:"line-number"},[s._v("76")]),t("br"),t("span",{staticClass:"line-number"},[s._v("77")]),t("br"),t("span",{staticClass:"line-number"},[s._v("78")]),t("br")])]),t("p",[s._v("使用 c++filt翻译函数符号名称_ZTV7MEMTEST为MEMTEST虚表指针")]),s._v(" "),t("div",{staticClass:"language-sh line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-sh"}},[t("code",[s._v("root@luo:~/workspace/memtest"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# c++filt _ZTV7MEMTEST")]),s._v("\nvtable "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" MEMTEST\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br")])]),t("p",[s._v("顺便查看一下虚函数表存的什么,~MEMTEST为虚析构函数地址(c++的多态相关)")]),s._v(" "),t("div",{staticClass:"language-sh line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-sh"}},[t("code",[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("gdb"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" x/10a 0x555555557cd0\n0x555555557cd0 "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("_ZTV7MEMTEST+1"),t("span",{pre:!0,attrs:{class:"token operator"}},[t("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("6")]),s._v(">")]),s._v(":\t0x555555555330 "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("MEMTEST::~MEMTEST"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("\t0x55555555534e "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("MEMTEST::~MEMTEST"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br")])]),t("p",[s._v("在类中没有虚函数时的内存")]),s._v(" "),t("div",{staticClass:"language- line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[s._v("0x55555556aea0:\t0x0\t0x21\n0x55555556aeb0:\t0xbb114514aa114514\t0x0\n0x55555556aea0:\t0x0\t0x21\n0x55555556aeb0:\t0xbb114514aa114514\t0x0\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br")])]),t("p",[s._v("在类中有虚函数时的内存")]),s._v(" "),t("div",{staticClass:"language-sh line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-sh"}},[t("code",[s._v("0x55555556aea0:\t0x0\t0x21\n0x55555556aeb0:\t0x555555557cd0 "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("_ZTV7MEMTEST+1"),t("span",{pre:!0,attrs:{class:"token operator"}},[t("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("6")]),s._v(">")]),s._v("\t0xbb114514aa114514\n0x55555556aec0:\t0x0\t0x21\n0x55555556aed0:\t0x555555557cd0 "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("_ZTV7MEMTEST+1"),t("span",{pre:!0,attrs:{class:"token operator"}},[t("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("6")]),s._v(">")]),s._v("\t0xbb114514aa114514\n0x55555556aee0:\t0x0\t0x21\n0x55555556aef0:\t0x555555557cd0 "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("_ZTV7MEMTEST+1"),t("span",{pre:!0,attrs:{class:"token operator"}},[t("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("6")]),s._v(">")]),s._v("\t0xbb114514aa114514\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br")])]),t("h2",{attrs:{id:"源码memtest-cpp"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#源码memtest-cpp"}},[s._v("#")]),s._v(" 源码memtest.cpp")]),s._v(" "),t("div",{staticClass:"language-c line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-c"}},[t("code",[t("span",{pre:!0,attrs:{class:"token macro property"}},[t("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),t("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("include")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v("")])]),s._v("\nusing namespace std"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\nclass MEMTEST\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\npublic"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(":")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 注释掉后就没有 虚表指针 0x555555557cd0 <_ZTV7MEMTEST+16>")]),s._v("\n virtual "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("~")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("MEMTEST")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" j"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("f")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("10000")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("++")]),s._v("i"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//")]),s._v("\n MEMTEST "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v("p "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" new MEMTEST"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n p"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("i "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("0xAA114514")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n p"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),s._v("j "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("0xBB114514")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n throw std"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("::")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("bad_alloc")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("main")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("f")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br"),t("span",{staticClass:"line-number"},[s._v("15")]),t("br"),t("span",{staticClass:"line-number"},[s._v("16")]),t("br"),t("span",{staticClass:"line-number"},[s._v("17")]),t("br"),t("span",{staticClass:"line-number"},[s._v("18")]),t("br"),t("span",{staticClass:"line-number"},[s._v("19")]),t("br"),t("span",{staticClass:"line-number"},[s._v("20")]),t("br"),t("span",{staticClass:"line-number"},[s._v("21")]),t("br"),t("span",{staticClass:"line-number"},[s._v("22")]),t("br"),t("span",{staticClass:"line-number"},[s._v("23")]),t("br"),t("span",{staticClass:"line-number"},[s._v("24")]),t("br"),t("span",{staticClass:"line-number"},[s._v("25")]),t("br"),t("span",{staticClass:"line-number"},[s._v("26")]),t("br"),t("span",{staticClass:"line-number"},[s._v("27")]),t("br"),t("span",{staticClass:"line-number"},[s._v("28")]),t("br"),t("span",{staticClass:"line-number"},[s._v("29")]),t("br"),t("span",{staticClass:"line-number"},[s._v("30")]),t("br"),t("span",{staticClass:"line-number"},[s._v("31")]),t("br"),t("span",{staticClass:"line-number"},[s._v("32")]),t("br"),t("span",{staticClass:"line-number"},[s._v("33")]),t("br")])])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/16.d264cc33.js b/assets/js/16.d264cc33.js new file mode 100644 index 0000000..49ef1d0 --- /dev/null +++ b/assets/js/16.d264cc33.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[16],{598:function(s,t,a){"use strict";a.r(t);var n=a(15),e=Object(n.a)({},(function(){var s=this,t=s.$createElement,a=s._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[a("h1",{attrs:{id:"_1-perf工具和火焰图简介"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_1-perf工具和火焰图简介"}},[s._v("#")]),s._v(" 1 perf工具和火焰图简介")]),s._v(" "),a("p",[s._v("能做什么:")]),s._v(" "),a("blockquote",[a("p",[s._v("可以分析函数执⾏的频繁程度")]),s._v(" "),a("p",[s._v("可以分析哪些函数经常阻塞")]),s._v(" "),a("p",[s._v("可以分析哪些函数频繁分配内存")])]),s._v(" "),a("p",[s._v("Flame Graph 原图路径:https://queue.acm.org/downloads/2016/Gregg4.svg")]),s._v(" "),a("p",[a("img",{attrs:{src:"https://queue.acm.org/downloads/2016/Gregg4.svg",alt:"img"}})]),s._v(" "),a("h1",{attrs:{id:"_2-通过perf收集函数堆栈信息绘制火焰图"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_2-通过perf收集函数堆栈信息绘制火焰图"}},[s._v("#")]),s._v(" 2 通过perf收集函数堆栈信息绘制火焰图")]),s._v(" "),a("h2",{attrs:{id:"_2-1-安装perf"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_2-1-安装perf"}},[s._v("#")]),s._v(" 2.1 安装perf")]),s._v(" "),a("blockquote",[a("p",[s._v("perf 命令(performance 的缩写)讲起, 它是 Linux 系统原⽣提供的性能分析⼯具, 会返回 CPU 正在执⾏的函数名以及调⽤栈(stack)")])]),s._v(" "),a("p",[s._v("安装perf")]),s._v(" "),a("div",{staticClass:"language- line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[s._v(" apt install linux-tools-common\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("p",[s._v("测试perf是否可用 perf.data为产生的文件")]),s._v(" "),a("div",{staticClass:"language-shell line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[s._v("┌──"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("root💀luo"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("-"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("~/workspace/flamegraph/src-flamegraph/test"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n└─"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# perf record -F 99 -a -g -- sleep 10")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v(" perf record: Woken up "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("times")]),s._v(" to "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("write")]),s._v(" data "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v(" perf record: Captured and wrote "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.598")]),s._v(" MB perf.data "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("3370")]),s._v(" samples"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n\n┌──"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("root💀luo"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("-"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("~/workspace/flamegraph/src-flamegraph/test"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n└─"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# ls")]),s._v("\nperf.data perf.data.old "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("test")]),s._v(" test.c\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br")])]),a("h2",{attrs:{id:"_2-2-编译并运行测试程序"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_2-2-编译并运行测试程序"}},[s._v("#")]),s._v(" 2.2 编译并运行测试程序")]),s._v(" "),a("p",[s._v("test.c 源码和接受在最下面")]),s._v(" "),a("div",{staticClass:"language-shell line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[s._v("┌──"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("root💀luo"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("-"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("~/workspace/flamegraph/src-flamegraph/test"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n└─"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# gcc -o test test.c -g")]),s._v("\n┌──"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("root💀luo"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("-"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("~/workspace/flamegraph/src-flamegraph/test"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n└─"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# ./test ")]),s._v("\nmain into\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br")])]),a("h2",{attrs:{id:"_2-3-使用perf采集数据"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_2-3-使用perf采集数据"}},[s._v("#")]),s._v(" 2.3 使用perf采集数据")]),s._v(" "),a("p",[s._v("perf record 表示采集系统事件, 没有使⽤ -e 指定采集事件, 则默认采集 cycles(即 CPU clock 周")]),s._v(" "),a("p",[s._v("期), -F 99 表示每秒 99 次, -p "),a("code",[s._v("pidof test")]),s._v("是进程号, 即对哪个进程进⾏分析, -g 表示记录调⽤栈,")]),s._v(" "),a("p",[s._v("sleep 30 则是持续 30 秒.")]),s._v(" "),a("div",{staticClass:"language-shell line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[s._v("┌──"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("root💀luo"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("-"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("~/workspace/flamegraph/src-flamegraph/test"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n└─"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# perf record -F 99 -p `pidof test` -g -- sleep 30 ")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v(" perf record: Woken up "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("times")]),s._v(" to "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("write")]),s._v(" data "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v(" perf record: Captured and wrote "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.235")]),s._v(" MB perf.data "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("2962")]),s._v(" samples"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n\n┌──"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("root💀luo"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("-"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("~/workspace/flamegraph/src-flamegraph/test"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n└─"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# ls")]),s._v("\nperf.data perf.data.old "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("test")]),s._v(" test.c\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br")])]),a("p",[s._v("使用perf report 可以看到堆栈热点函数")]),s._v(" "),a("div",{staticClass:"language-shell line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[s._v("┌──"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("root💀luo"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("-"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("~/workspace/flamegraph/src-flamegraph/test"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n└─"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# perf report ")]),s._v("\n\nSamples: 2K of event "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'cpu-clock:pppH'")]),s._v(", Event count "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("approx."),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(": "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("29919191620")]),s._v(" \n Children Self Command Shared Object Symbol \n+ "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("100.00")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.00")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("test")]),s._v(" libc-2.31.so "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("."),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" __libc_start_main\n+ "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("100.00")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("29.71")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("test")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("test")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("."),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" main\n+ "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("35.58")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("35.55")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("test")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("test")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("."),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" func_c\n+ "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("19.85")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("19.85")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("test")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("test")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("."),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" func_b\n+ "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("14.85")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("9.55")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("test")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("test")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("."),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" func_a\n+ "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("5.30")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("5.30")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("test")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("test")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("."),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" func_d\n "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.03")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.03")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("test")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("kernel.kallsyms"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("k"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" __lock_text_start\n "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.03")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.00")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("test")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("kernel.kallsyms"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("k"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" apic_timer_interrupt\n "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.03")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.00")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("test")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("kernel.kallsyms"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("k"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" smp_apic_timer_interrupt\n "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.03")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.00")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("test")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("kernel.kallsyms"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("k"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" irq_exit\n "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.03")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.00")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("test")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("kernel.kallsyms"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("k"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" __softirqentry_text_start\n "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.03")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.00")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("test")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("kernel.kallsyms"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("k"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" run_timer_softirq\n "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.03")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.00")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("test")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("kernel.kallsyms"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("k"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" __run_timers.part.0\n "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.03")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.00")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("test")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("kernel.kallsyms"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("k"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" call_timer_fn\n "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.03")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.00")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("test")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("kernel.kallsyms"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("k"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" rh_timer_func\n "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.03")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.00")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("test")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("kernel.kallsyms"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("k"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" usb_hcd_poll_rh_status\n "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.03")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.00")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("test")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("kernel.kallsyms"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("k"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" uhci_hub_status_data\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br"),a("span",{staticClass:"line-number"},[s._v("20")]),a("br"),a("span",{staticClass:"line-number"},[s._v("21")]),a("br"),a("span",{staticClass:"line-number"},[s._v("22")]),a("br")])]),a("h2",{attrs:{id:"_2-4-下载火焰图脚本"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_2-4-下载火焰图脚本"}},[s._v("#")]),s._v(" 2.4 下载火焰图脚本")]),s._v(" "),a("p",[s._v("https://github.com/brendangregg/FlameGraph")]),s._v(" "),a("p",[s._v("git clone https://gitee.com/mirrors/FlameGraph.git")]),s._v(" "),a("div",{staticClass:"language-shell line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[s._v("┌──"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("root💀luo"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("-"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("~/workspace/flamegraph/src-flamegraph/test"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n└─"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# git clone https://gitee.com/mirrors/FlameGraph.git ")]),s._v("\nCloning into "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'FlameGraph'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("..")]),s._v(".\nremote: Enumerating objects: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1147")]),s._v(", done.\nremote: Total "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1147")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("delta "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(", reused "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("delta "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(", pack-reused "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1147")]),s._v("\nReceiving objects: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("100")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1147")]),s._v("/1147"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1.87")]),s._v(" MiB "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("806.00")]),s._v(" KiB/s, done.\nResolving deltas: "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("100")]),s._v("% "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("674")]),s._v("/674"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(", done.\n\n┌──"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("root💀luo"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("-"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("~/workspace/flamegraph/src-flamegraph/test"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n└─"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# ls")]),s._v("\nFlameGraph perf.data perf.data.old "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("test")]),s._v(" test.c\n\n┌──"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("root💀luo"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("-"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("~/workspace/flamegraph/src-flamegraph/test"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n└─"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# ls FlameGraph/")]),s._v("\naix-perf.pl stackcollapse-gdb.pl\ndemos stackcollapse-go.pl\ndev stackcollapse-instruments.pl\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("..")]),s._v(".\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("..")]),s._v(".\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br")])]),a("h2",{attrs:{id:"_2-5-生成火焰图"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_2-5-生成火焰图"}},[s._v("#")]),s._v(" 2.5 生成火焰图")]),s._v(" "),a("div",{staticClass:"language-shell line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[s._v("┌──"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("root💀luo"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("-"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("~/workspace/flamegraph/src-flamegraph/test"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n└─"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# perf script | ./FlameGraph/stackcollapse-perf.pl | ./FlameGraph/flamegraph.pl > process.svg")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("p",[s._v("下载到windows桌面用浏览器打开查看效果")]),s._v(" "),a("p",[s._v("https://lzwtty.oss-cn-hangzhou.aliyuncs.com/blogimage/acknowledge/test_flamegraph.svg")]),s._v(" "),a("p",[a("img",{attrs:{src:"https://lzwtty.oss-cn-hangzhou.aliyuncs.com/blogimage/acknowledge/test_flamegraph.svg",alt:"img"}})]),s._v(" "),a("p",[s._v("可以很清晰的看到热点函数调用占用cpu使用率")]),s._v(" "),a("h2",{attrs:{id:"_2-5-火焰图的含义"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#_2-5-火焰图的含义"}},[s._v("#")]),s._v(" 2.5 ⽕焰图的含义")]),s._v(" "),a("p",[s._v("⽕焰图是基于 stack 信息⽣成的 SVG 图⽚, ⽤来展示 CPU 的调⽤栈。")]),s._v(" "),a("ul",[a("li",[s._v("y 轴表示调⽤栈, 每⼀层都是⼀个函数. 调⽤栈越深, ⽕焰就越⾼, 顶部就是正在执⾏的函数, 下")])]),s._v(" "),a("p",[s._v("⽅都是它的⽗函数.")]),s._v(" "),a("ul",[a("li",[s._v("x 轴表示抽样数, 如果⼀个函数在 x 轴占据的宽度越宽, 就表示它被抽到的次数多, 即执⾏的时")])]),s._v(" "),a("p",[s._v("间⻓. 注意, x 轴不代表时间, ⽽是所有的调⽤栈合并后, 按字⺟顺序排列的.")]),s._v(" "),a("ul",[a("li",[s._v("⽕焰图就是看顶层的哪个函数占据的宽度最⼤. 只要有 “平顶”(plateaus), 就表示该函数可能存")])]),s._v(" "),a("p",[s._v("在性能问题。")]),s._v(" "),a("ul",[a("li",[s._v("颜⾊没有特殊含义, 因为⽕焰图表示的是 CPU 的繁忙程度, 所以⼀般选择暖⾊调.")])]),s._v(" "),a("h2",{attrs:{id:"源码test-c"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#源码test-c"}},[s._v("#")]),s._v(" 源码test.c")]),s._v(" "),a("div",{staticClass:"language-c line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-c"}},[a("code",[a("span",{pre:!0,attrs:{class:"token macro property"}},[a("span",{pre:!0,attrs:{class:"token directive-hash"}},[s._v("#")]),a("span",{pre:!0,attrs:{class:"token directive keyword"}},[s._v("include")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("")])]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("func_d")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 5")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("5")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("10000")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//5")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("func_a")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 10+5= 15")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("10")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("10000")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//10 ")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("func_d")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//5 ")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("func_b")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("20")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("10000")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 20")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("func_c")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("35")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("10000")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 35")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("main")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("printf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"main into\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("while")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 100")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("int")]),s._v(" i "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("30")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("10000")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" i"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("--")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 30 ")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("func_a")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("//10+5 =15")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("func_b")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 20")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("func_c")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 35")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("printf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"main end\\n"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br"),a("span",{staticClass:"line-number"},[s._v("20")]),a("br"),a("span",{staticClass:"line-number"},[s._v("21")]),a("br"),a("span",{staticClass:"line-number"},[s._v("22")]),a("br"),a("span",{staticClass:"line-number"},[s._v("23")]),a("br"),a("span",{staticClass:"line-number"},[s._v("24")]),a("br"),a("span",{staticClass:"line-number"},[s._v("25")]),a("br"),a("span",{staticClass:"line-number"},[s._v("26")]),a("br"),a("span",{staticClass:"line-number"},[s._v("27")]),a("br"),a("span",{staticClass:"line-number"},[s._v("28")]),a("br"),a("span",{staticClass:"line-number"},[s._v("29")]),a("br"),a("span",{staticClass:"line-number"},[s._v("30")]),a("br"),a("span",{staticClass:"line-number"},[s._v("31")]),a("br"),a("span",{staticClass:"line-number"},[s._v("32")]),a("br")])])])}),[],!1,null,null,null);t.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/17.79a30f21.js b/assets/js/17.79a30f21.js new file mode 100644 index 0000000..36a9e53 --- /dev/null +++ b/assets/js/17.79a30f21.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[17],{602:function(e,r,t){"use strict";t.r(r);var n=t(15),o=Object(n.a)({},(function(){var e=this,r=e.$createElement,t=e._self._c||r;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h2",{attrs:{id:"学习网站"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#学习网站"}},[e._v("#")]),e._v(" 学习网站")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://xiaolincoding.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("小林coding的图解系统"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://programmercarl.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("代码随想录"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://www.draw.io/",target:"_blank",rel:"noopener noreferrer"}},[e._v("好用的在线思维导图"),t("OutboundLink")],1)]),e._v(" "),t("h2",{attrs:{id:"博客地址"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#博客地址"}},[e._v("#")]),e._v(" 博客地址")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://blog.csdn.net/g_hongjin/article/details/51649246",target:"_blank",rel:"noopener noreferrer"}},[e._v("高并发系统之限流特技"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://blog.csdn.net/wjf1991wjf/article/details/49100893",target:"_blank",rel:"noopener noreferrer"}},[e._v("动态链接库中函数的地址确定---PLT和GOT"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://blog.csdn.net/yangkuanqaz85988/article/details/52403726",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.biaodianfu.com/redis-vs-memcached.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Redis和Memcached的区别"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.nowcoder.com/discuss/26226",target:"_blank",rel:"noopener noreferrer"}},[e._v("epoll内核源码详解+自己总结的流程"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://blog.csdn.net/jcjc918/article/details/50434462",target:"_blank",rel:"noopener noreferrer"}},[e._v("后台开发面试问题整理"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://blog.csdn.net/jansonzhe/article/details/48576025",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux内核:poll机制"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://blog.csdn.net/caoyan_12727/article/details/52346729",target:"_blank",rel:"noopener noreferrer"}},[e._v("linux任务调度机制"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://blog.csdn.net/jansonzhe/article/details/48576025",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux内核:poll机制"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://www.cnblogs.com/hzmark/p/raft.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("解读Raft(一 算法基础) - 杭州.Mark - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/alantu2018/p/8461749.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux文件系统详解 - AlanTu - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://blog.csdn.net/initphp/article/details/50833036",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux c 开发 - 内存管理器ptmalloc - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://blog.csdn.net/llzk_/article/details/53813266",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux环境变量及其设置 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/mfryf/p/5390442.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("比较全面的gdb调试命令 - 知识天地 - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://blog.csdn.net/shallnet/article/details/47132861",target:"_blank",rel:"noopener noreferrer"}},[e._v("把握linux内核设计思想(六):内核时钟中断 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/skying555/p/5029620.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux进程调度原理 - alex.shu - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://blog.csdn.net/yhf19881015/article/details/7570354",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux系统调用的实现机制分析 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://www.ruanyifeng.com/blog/2011/12/inode.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("理解inode - 阮一峰的网络日志"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://blog.csdn.net/wm_1991/article/details/52218718",target:"_blank",rel:"noopener noreferrer"}},[e._v("多阶hash表 - juary_的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://blog.csdn.net/maokelong95/article/details/51989081",target:"_blank",rel:"noopener noreferrer"}},[e._v("理解 glibc malloc - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.chinaunix.net/uid-26111972-id-3420130.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Redis与Memcached的比较-zpf1218-ChinaUnix博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://blog.csdn.net/eroswang/article/details/4130972",target:"_blank",rel:"noopener noreferrer"}},[e._v("glibc中malloc的详细解释 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/Survivalist/p/8119891.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Redis的那些最常见面试问题 - 回首笑人间 - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://blog.csdn.net/caishenfans/article/details/44779797",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅析基于glibc的malloc - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/wangzahngjun/p/4977425.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("slab机制 - wangLinuxer - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://blog.163.com/dengminwen@126/blog/static/870226720097189486788/",target:"_blank",rel:"noopener noreferrer"}},[e._v("有感于STL的内存管理"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://blog.csdn.net/qq100440110/article/details/50908992",target:"_blank",rel:"noopener noreferrer"}},[e._v("DNS使用的是TCP协议还是UDP协议 - qq100440110的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://blog.csdn.net/zhongbeida_xue/article/details/51280292",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux的任务调度机制 - Nicholas的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://blog.csdn.net/qq_26768741/article/details/54375524",target:"_blank",rel:"noopener noreferrer"}},[e._v("进程—内存描述符(mm_struct) - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/chenqf/p/6386163.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("彻底弄懂HTTP缓存机制及原理 - 木上有水 - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://blog.csdn.net/syzcch/article/details/8075830",target:"_blank",rel:"noopener noreferrer"}},[e._v("利用CAS操作(Compare & Set)实现无锁队列 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/LUO77/p/5816326.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("进程间通信的方式——信号、管道、消息队列、共享内存 - 0giant - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://blog.csdn.net/woshinia/article/details/22877007",target:"_blank",rel:"noopener noreferrer"}},[e._v("TCP的数据流——滑动窗口,拥塞窗口,慢启动,Nagle算法,经受时延的确认等 - 千里之外 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/yangbodong/p/4964698.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("TCP协议总结--停止等待协议,连续ARQ协议,滑动窗口协议 - 杨博东的博客 - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/fangyukuan/archive/2010/09/18/1829871.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("C/C++ 笔试、面试题目大汇总 - fangyukuan - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://blog.csdn.net/chy19911123/article/details/48894579",target:"_blank",rel:"noopener noreferrer"}},[e._v("C/C++ 内存对齐原则及作用 - chy19911123的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/wmbg/p/6800354.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("mysql数据库面试总结 - bullets - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/ybwang/archive/2010/06/04/1751279.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("[学习笔记]数据库设计三大范式与BCNF,学习笔记 - ybwang1989 - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://blog.csdn.net/weinierzui/article/details/71054964",target:"_blank",rel:"noopener noreferrer"}},[e._v("常见面试题整理--数据库篇(每位开发者必备) - weinierzui的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://lib.csdn.net/mobile/article/linux/43599",target:"_blank",rel:"noopener noreferrer"}},[e._v("知识库 - 你身边的技术百科全书 - CSDN"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://blog.csdn.net/bingshanyijiao_fkx/article/details/51821034",target:"_blank",rel:"noopener noreferrer"}},[e._v("进程上下文与线程上下文 - bingshanyijiao_fkx的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.jb51.net/article/102004.htm",target:"_blank",rel:"noopener noreferrer"}},[e._v("linux线程切换和进程切换的方法_Linux_脚本之家"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://blog.csdn.net/al_xin/article/details/38590931",target:"_blank",rel:"noopener noreferrer"}},[e._v("深入理解计算机系统之虚拟存储器 - Al_xin的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.jianshu.com/p/ff26312e67a9",target:"_blank",rel:"noopener noreferrer"}},[e._v("tcp的半连接与完全连接队列 - go4it - 简书"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://blog.csdn.net/wust_zzwh/article/details/52100392",target:"_blank",rel:"noopener noreferrer"}},[e._v("数位dp总结 之 从入门到模板 - 努力 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/beaglebone/p/5727287.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("类中函数的重载、隐藏和覆盖 - beaglebone - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/dwj411024/p/5978821.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("排序算法____基数排序 - Dingwj_blog - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.nowcoder.com/discuss/57978",target:"_blank",rel:"noopener noreferrer"}},[e._v("面试题干货在此_讨论区_牛客网"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://blog.csdn.net/lemon_tree12138/article/details/51695211",target:"_blank",rel:"noopener noreferrer"}},[e._v("排序算法系列:基数排序 - 大鱼 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/LBSer/p/3322630.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("位图索引:原理(BitMap index) - zhanlijun - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/joeblackzqq/archive/2011/04/11/2013010.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("fopen与open的区别 - 清清飞扬 - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.jianshu.com/p/a7633d7687c2",target:"_blank",rel:"noopener noreferrer"}},[e._v("《深入理解计算机系统》-虚拟存储器 - gatsby_dhn - 简书"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/zengyiwen/p/5755170.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux内核解析:进程间通信:管道 - 笨拙的菜鸟 - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://blog.csdn.net/cmm0401/article/details/77950122",target:"_blank",rel:"noopener noreferrer"}},[e._v("参考别人的面试总结:linux C/C++服务器后台开发面试题总结 - 大孟的博客 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/nancymake/p/6516933.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("linux C/C++服务器后台开发面试题总结 - Nancy26 - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://blog.csdn.net/w1300048671/article/details/72833835",target:"_blank",rel:"noopener noreferrer"}},[e._v("ELF 文件中的section 和 segment - wo_der的博客 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://blog.csdn.net/linyt/article/details/51635768",target:"_blank",rel:"noopener noreferrer"}},[e._v("聊聊Linux动态链接中的PLT和GOT(1)——何谓PLT与GOT - 海枫的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://jzhihui.iteye.com/blog/1447570",target:"_blank",rel:"noopener noreferrer"}},[e._v("ELF文件的加载和动态链接过程 - - ITeye博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://blog.csdn.net/gatieme/article/details/51628257",target:"_blank",rel:"noopener noreferrer"}},[e._v("ELF文件的加载过程(load_elf_binary函数详解)--Linux进程的管理与调度(十三) - AderStep - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("linux awk命令详解 - ggjucheng - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://blog.csdn.net/cumirror/article/details/5071234",target:"_blank",rel:"noopener noreferrer"}},[e._v("IP分片和TCP分片的区别 - cumirror的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://blog.csdn.net/shenwansangz/article/details/39184789",target:"_blank",rel:"noopener noreferrer"}},[e._v("fork()----父子进程共享 - 程序狗的成长之路 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://blog.csdn.net/liangkaiming/article/details/6267357",target:"_blank",rel:"noopener noreferrer"}},[e._v("Makefile中的wildcard用法 - liangkaiming的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/chgaowei/article/details/6427731",target:"_blank",rel:"noopener noreferrer"}},[e._v("深入理解C++的动态绑定和静态绑定 - 常高伟的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://blog.jobbole.com/83461/",target:"_blank",rel:"noopener noreferrer"}},[e._v("C++模板元编程(C++ template metaprogramming) - 文章 - 伯乐在线"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/shanghairuoxiao/article/details/72876248",target:"_blank",rel:"noopener noreferrer"}},[e._v("C++后台开发校招面试常见问题 - oscarwin - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://blog.csdn.net/hzhzh007/article/details/6532988",target:"_blank",rel:"noopener noreferrer"}},[e._v("互斥锁的实现(转) - hzhzh007的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://blog.csdn.net/wdscq1234/article/details/52463952",target:"_blank",rel:"noopener noreferrer"}},[e._v("TCP-IP详解:糊涂窗口综合症(Silly Window syndrome) - 深邃 精致 内涵 坚持 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://blog.csdn.net/qq_29503203/article/details/54618275",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅析Linux下的task_struct结构体 - qq_29503203的博客 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/crystal_avast/article/details/7678704",target:"_blank",rel:"noopener noreferrer"}},[e._v("C++虚继承的概念 - crystal_avast的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/dqjyong/article/details/8029527",target:"_blank",rel:"noopener noreferrer"}},[e._v("c++ 虚继承与继承的差异 - Kikim的地盘 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/itech/archive/2012/05/15/2502284.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux的inode的理解 - iTech - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/liuhongxiangm/article/details/8716232",target:"_blank",rel:"noopener noreferrer"}},[e._v("IPC通信:Posix消息队列 - liuhongxiangm的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/jiqingwu/p/linux_semaphore_example.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux线程的信号量同步 - JollyWing - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/ljianhui/article/details/10253345",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux进程间通信——使用共享内存 - ljianhui的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/u014403008/article/details/54174109",target:"_blank",rel:"noopener noreferrer"}},[e._v("gdb调试coredump(使用篇) - 叶落无痕,枫过有情…… - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/benkaoya/article/details/17262053",target:"_blank",rel:"noopener noreferrer"}},[e._v("信号中断 与 慢系统调用 - 许振坪的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/funeral/archive/2013/03/06/2945485.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅析CPU中断技术 - Funeral - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/hoys/archive/2012/08/19/2646377.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux信号(signal) 机制分析 - h13 - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/q576709166/article/details/8649911",target:"_blank",rel:"noopener noreferrer"}},[e._v("EPOLLIN , EPOLLOUT , EPOLLPRI, EPOLLERR 和 EPOLLHUP事件 - yingying.liu的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/cxjchen/p/3143633.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("三种工厂模式的分析以及C++实现 - 曾经的你| - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/hackbuteer1/article/details/7740956",target:"_blank",rel:"noopener noreferrer"}},[e._v("STL源码剖析---红黑树原理详解上 - Hackbuteer1的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/sduliulun/article/details/7732906",target:"_blank",rel:"noopener noreferrer"}},[e._v("valgrind 的使用简介 - sduliulun的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.jb51.net/article/123056.htm",target:"_blank",rel:"noopener noreferrer"}},[e._v("_unix linux_脚本之家"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/starlitnext/archive/2013/03/07/2948929.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("GDT(Global Descriptor Table)全局描述符表 - starlitnext - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/hnzziafyz/article/details/52200265",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux程序加载过程 - 赢在拼搏中 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/zlcxbb/p/5841417.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("linux 用户空间与内核空间——高端内存详解 - 立超的专栏 - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/freeelinux/article/details/53782986",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux虚拟地址空间布局以及进程栈和线程栈总结 - wilcohuang's blog - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/houjun/p/4889597.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("堆排算法的分析与总结 - HOU_JUN - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/zhangliangzi/article/details/51336564",target:"_blank",rel:"noopener noreferrer"}},[e._v("HTTP必知必会——常见面试题总结 - Leeon的博客 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/tom555cat/article/details/22888143",target:"_blank",rel:"noopener noreferrer"}},[e._v("pthread_once单例模式 - tom555cat - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/jsh13417/article/details/10934239",target:"_blank",rel:"noopener noreferrer"}},[e._v("pthread_once()使用(某个时间在整个程序中仅执行一次,不确定是那个线程) - 轻飘飞扬 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/thingk/p/4553243.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("23种设计模式对比与总结 - 码农恋码 - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/sinat_34093604/article/details/53082000",target:"_blank",rel:"noopener noreferrer"}},[e._v("ORM框架使用优缺点 - public - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/zhanghairong/p/3757656.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("高性能服务开发之定时器 - 行健 - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/zxj015/p/6530766.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Https协议详解 - CoderZhuang - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://www.ruanyifeng.com/blog/2014/09/illustration-ssl.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("图解SSL/TLS协议 - 阮一峰的网络日志"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/zery/p/5164795.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("HTTPS 原理解析 - Zery - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/end/archive/2011/05/25/2057129.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux的用户和用户组管理 - 风生水起 - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/lshs/p/6038535.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("TCP系列13—重传—3、协议中RTO计算和RTO定时器维护 - lshs - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/xmphoenix/archive/2011/10/23/2221879.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("可执行文件(ELF)格式的理解 - 深海的小鱼儿 - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/yasi_xi/article/details/18551745",target:"_blank",rel:"noopener noreferrer"}},[e._v("GCC/G++编译参数含义 - yasi_xi的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/leopard_ray/article/details/1763796",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux内核中cache的实现 - leopard_ray的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/apprentice89/p/3234677.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("epoll源码实现分析[整理] - Apprentice89 - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/goodluckwhh/article/details/10026311",target:"_blank",rel:"noopener noreferrer"}},[e._v("linux内核内存管理学习之三(slab分配器) - 浩海拾贝 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/davidsguo008/article/details/73556811",target:"_blank",rel:"noopener noreferrer"}},[e._v("深度理解select、poll和epoll - 傻眼哥的博客 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/c-cloud/p/3224788.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("【经典算法】——KMP,深入讲解next数组的求解 - c_cloud - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/droidphone/article/details/7445825",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux中断(interrupt)子系统之一:中断系统基本原理 - DroidPhone的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/lyy-5518/p/5460994.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("HTTP Session、Cookie机制详解 - 奔跑的001 - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/zhaoYuQing-java2015/p/4621384.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("HttpSession详解 - 别再顺其自然 - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/cswuyg/p/3653263.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("HTTP的长连接和短连接 - 烛秋 - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://m.baidu.com/from=2001a/s?iscookie=1&word=%E8%87%AA%E5%8A%A8%E5%8C%96%E6%9E%84%E5%BB%BA&ts=6510139&t_kt=78&ie=utf-8&fm_kl=17709454cf&rsv_iqid=0503722478&rsv_t=84f8eru9GFuEsiQMa105nzgqWDbdrP3mCZXXZxmf92P66MWQOfEfcNQ18%252B0&sa=ib&rsv_pq=0503722478&rsv_sug4=5170&inputT=2385&ss=100&setTaijiCookie=1",target:"_blank",rel:"noopener noreferrer"}},[e._v("自动化构建 - 百度"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/zengyiwen/p/5755191.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("linux内核之进程的基本概念(进程,进程组,会话关系) - 笨拙的菜鸟 - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/forstudy/archive/2012/04/03/2427683.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux--进程组、会话、守护进程 - Alex_Monkey - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/chuxiuhong/p/6103928.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("银行家算法学习笔记 - 唯心不易 - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/YangloveFeng/article/details/7872251",target:"_blank",rel:"noopener noreferrer"}},[e._v("linux session 浅谈 - younghongjian的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/JohnABC/p/4079669.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux-进程、进程组、作业、会话、控制终端详解 - John_ABC - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/qq_16912651/article/details/53509063",target:"_blank",rel:"noopener noreferrer"}},[e._v("关系型数据库到文档型数据库的跨越 - 海天一色是黑色的博客 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/mickole/p/3188321.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("linux系统编程之进程(八):守护进程详解及创建,daemon()使用 - mickole - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/linjiqin/archive/2012/04/01/2428695.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("数据库设计三大范式 - Ruthless - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/remember-forget/p/6140112.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("常见面试题整理--数据库篇 - 铭记遗忘 - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/shuaihj/article/details/14163713",target:"_blank",rel:"noopener noreferrer"}},[e._v("谈谈数据库的ACID - 敦格 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/cws1214/article/details/52430554",target:"_blank",rel:"noopener noreferrer"}},[e._v("关于TCP乱序和重传的问题 - cws1214的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://www.ruanyifeng.com/blog/2016/06/dns.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("DNS 原理入门 - 阮一峰的网络日志"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/metalseed/article/details/8039326",target:"_blank",rel:"noopener noreferrer"}},[e._v("数据结构专题——线段树 - MetalSeed - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/TenosDoIt/p/3453089.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("一步一步理解线段树 - tenos - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/huangye-dream/archive/2013/07/06/3174725.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("mysql 数据表读锁机制详解 - joy696163 - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/weixliu/p/3900764.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("单例模式全面学习(C++版) - weixliu - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/cxjchen/p/3148582.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("单例模式及C++实现代码 - 曾经的你| - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/cywosp/article/details/23397179",target:"_blank",rel:"noopener noreferrer"}},[e._v("每天进步一点点——五分钟理解一致性哈希算法(consistent hashing) - Cynric 的博客 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.chinaunix.net/uid-20788636-id-2626119.html?/11207.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("TCP 协议中MSS的理解-frankzfz-ChinaUnix博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/newwy/p/3254029.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("TCP/IP详解学习笔记(15)-- TCP的流量控制和拥塞控制 - newwy - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/losbyday/p/5847041.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("TCP/IP详解--拥塞控制 & 慢启动 快恢复 拥塞避免 - losbyday - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/Scythe666/article/details/47132447",target:"_blank",rel:"noopener noreferrer"}},[e._v("关于C++中公有继承、私有继承、保护继承的讨论 - This is bill的专属博客 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/zeb_perfect/article/details/52574915",target:"_blank",rel:"noopener noreferrer"}},[e._v("解决Hash碰撞冲突方法总结 - zeb_perfect的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/anonymalias/article/details/9938865",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux进程通信之POSIX共享内存 - anonymalias的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/xiaohuima_dong/article/details/45096739",target:"_blank",rel:"noopener noreferrer"}},[e._v("IPC对象持续性 - xiaohuima_dong的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.itpub.net/7584541/viewspace-851939",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux环境进程间通信(三):消息队列-hnsyspc-ITPUB博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/anonymalias/article/details/9219945",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux进程同步之POSIX信号量 - anonymalias的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/memewry/archive/2012/08/22/2651696.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("进程/线程同步的方式和机制,进程间通信 - Icnblog_Wan - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/dyllove98/archive/2013/06/28/3161371.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux进程同步之记录锁(fcntl) - jlins - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://www.cnblogs.com/cherishui/p/4246133.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux 伙伴算法简介 - 浩天之家 - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/Anker/p/3271773.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("孤儿进程与僵尸进程[总结] - Anker's Blog - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://www.cnblogs.com/xzzzh/p/6596982.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux虚拟地址空间布局以及进程栈和线程栈总结 - Xzzzh - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://watter1985.iteye.com/blog/1614039",target:"_blank",rel:"noopener noreferrer"}},[e._v("linux 内核poll/select/epoll实现剖析 - 在思考的路上 - ITeye博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://www.cnblogs.com/clover-toeic/p/3754433.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux虚拟地址空间布局 - clover_toeic - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/hguisu/article/details/8680808",target:"_blank",rel:"noopener noreferrer"}},[e._v("HTTP详解(1)-工作原理 - guisu,程序人生。 逆水行舟,不进则退。 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://www.cnblogs.com/zl-graduate/articles/6724446.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("epoll简介及触发模式(accept、read、send) - 留下的只是回忆 - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://www.cnblogs.com/hanyan225/archive/2011/07/17/2108609.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("linux内核分析笔记----中断和中断处理程序 - ☆&寒 烟☆ - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/big_bit/article/details/51804391",target:"_blank",rel:"noopener noreferrer"}},[e._v("标准IO与文件IO 的区别 - big_bit的博客 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/zhangskd/article/details/21992933",target:"_blank",rel:"noopener noreferrer"}},[e._v("硬中断和软中断 - zhangskd的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/wenhui_/article/details/6889013",target:"_blank",rel:"noopener noreferrer"}},[e._v("可重入和不可重入 - wenhui_的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://www.cnblogs.com/zbtrs/p/6106783.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅谈数位DP - zbtrs - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://www.cppblog.com/wanghaiguang/archive/2012/06/05/177644.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("C++ Queues(队列)、Priority Queues(优先队列) - 面对现实,超越自己 - C++博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://flychao88.iteye.com/blog/1977653",target:"_blank",rel:"noopener noreferrer"}},[e._v("缓存淘汰算法--LRU算法 - 小程故事多 - ITeye博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.chinaunix.net/uid-127037-id-2919545.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux内核中内存cache的实现-yfydz-ChinaUnix博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/petershina/article/details/7946615",target:"_blank",rel:"noopener noreferrer"}},[e._v("socket编程中write、read和send、recv之间的区别 - petershina的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/weiyuefei/article/details/52242890",target:"_blank",rel:"noopener noreferrer"}},[e._v("彻底学会使用epoll(六)——关于ET的若干问题总结 - feeman的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://www.cnblogs.com/mickole/p/3188321.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("linux系统编程之进程(八):守护进程详解及创建,daemon()使用 - mickole - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://segmentfault.com/a/1190000003063859",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux IO模式及 select、poll、epoll详解 - 人云思云 - SegmentFault"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://www.cnblogs.com/Anker/p/3265058.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("select、poll、epoll之间的区别总结[整理] - Anker's Blog - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://www.cnblogs.com/hsd-/p/6139376.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("树状数组彻底入门 - 半根毛线 - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/Kelvin_Yan/article/details/42673963",target:"_blank",rel:"noopener noreferrer"}},[e._v("C++的new、delete及其内存管理 - Kelvin_Yan的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://www.cnblogs.com/Commence/p/5785912.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("malloc 函数详解 - Commence - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://www.jianshu.com/p/3985b1f9d9b4",target:"_blank",rel:"noopener noreferrer"}},[e._v("浅谈数据库查询优化的几种思路 - 六尺帐篷 - 简书"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://www.linuxidc.com/Linux/2014-03/98013.htm",target:"_blank",rel:"noopener noreferrer"}},[e._v("硬中断与软中断的区别_Linux编程_Linux公社-Linux系统门户网站"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://www.cnblogs.com/33debug/p/6993397.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("信号的基本概念、信号的产生以及阻塞信号 - 滴巴戈 - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://www.cnblogs.com/hoys/archive/2012/08/19/2646377.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux信号(signal) 机制分析 - h13 - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/yusiguyuan/article/details/11908891",target:"_blank",rel:"noopener noreferrer"}},[e._v("linux中断--LINUX中断机制与信号 - 鱼思故渊的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/echoisland/article/details/6403763",target:"_blank",rel:"noopener noreferrer"}},[e._v("进程线程及堆栈关系的总结 - echoisland的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/jelly_9/article/details/53239718",target:"_blank",rel:"noopener noreferrer"}},[e._v("栈帧之深入理解c函数调用过程 - jelly_9的博客 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://transcoder.baiducontent.com/from=2001a/bd_page_type=1/ssid=0/uid=0/pu=usm%403%2Csz%401320_2003%2Cta%40iphone_1_10.3_1_11.6/baiduid=F8EB1922487B57E4B9B568A60C98DEC3/w=0_10_/t=iphone/l=3/tc?ref=www_iphone&lid=13486286999679729314&order=4&fm=alop&h5ad=1&srd=1&dict=32&tj=www_normal_4_0_10_title&url_mf_score=4&vit=osres&m=8&cltj=cloud_title&asres=1&nt=wnor&title=%E7%BB%8F%E5%85%B8%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84B%E6%A0%91%E4%B8%8EB%2B%E6%A0%91-vincently-%E5%8D%9A%E5%AE%A2%E5%9B%AD&w_qd=IlPT2AEptyoA_yi8mgBQ&sec=23916&di=0b59451c68b1bb67&bdenc=1&tch=124.115.52.1089.3.133&nsrc=IlPT2AEptyoA_yixCFOxXnANedT62v3IEQGG_ytK1DK6mlrte4viZQRAVDb6M8qMF5nkgTCccQoDlnCe0WAj8xJZhOgtfq&eqid=bb28ea92a2e100001000000559b7d367&wd=&clk_info=%7B%22srcid%22%3A%221599%22%2C%22tplname%22%3A%22www_normal%22%2C%22t%22%3A1505219442195%2C%22sig%22%3A%2211132%22%2C%22xpath%22%3A%22div-a-h3%22%7D",target:"_blank",rel:"noopener noreferrer"}},[e._v("【经典数据结构】B树与B+树 - vincently - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://m.baidu.com/from=2001a/bd_page_type=1/ssid=0/uid=0/pu=usm%401%2Csz%401320_2003%2Cta%40iphone_1_10.3_1_11.6/baiduid=F8EB1922487B57E4B9B568A60C98DEC3/w=0_10_/t=iphone/l=3/tc?ref=www_iphone&lid=11507469517477021613&order=2&fm=alop&tj=www_normal_2_0_10_title&vit=osres&m=8&srd=1&cltj=cloud_title&asres=1&nt=wnor&title=Linux%E8%99%9A%E6%8B%9F%E5%86%85%E5%AD%98%E5%92%8C%E7%89%A9%E7%90%86%E5%86%85%E5%AD%98%E7%9A%84%E7%90%86%E8%A7%A3_Linux%E6%95%99%E7%A8%8B_Linux%E5%85%AC%E7%A4%BE...&dict=20&w_qd=IlPT2AEptyoA_yitJU7sE7CvJkxUooQnwDAYaBXV9BM7N4Q6YExaxnDfnwe&sec=23771&di=1360f35ab201f829&bdenc=1&tch=124.133.28.761.2.4530456&nsrc=IlPT2AEptyoA_yixCFOxXnANedT62v3IEQGG_yJR0CumpEm9xP4kHREsRFv7Lmq3ZpPPdj0PtAIFwmGdWWUn7hlDr0IwdzW&eqid=9fb2be8e94da88001000000559afe1b3&wd=&clk_info=%7B%22srcid%22%3A%221599%22%2C%22tplname%22%3A%22www_normal%22%2C%22t%22%3A1504698815807%2C%22sig%22%3A%222215%22%2C%22xpath%22%3A%22div-a-h3%22%7D&sfOpen=1",target:"_blank",rel:"noopener noreferrer"}},[e._v("linux 物理内存和虚拟内存 - 百度"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://www.cnblogs.com/biyeymyhjob/archive/2012/07/20/2601204.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("C/C++函数调用过程分析 - as_ - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/whz_zb/article/details/7425152",target:"_blank",rel:"noopener noreferrer"}},[e._v("胜者树与败者树 - whz_zb的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/u012398613/article/details/51787548",target:"_blank",rel:"noopener noreferrer"}},[e._v("Epoll详解及源码分析 - 我有我的天空 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://m.baidu.com/from=2001a/bd_page_type=1/ssid=0/uid=0/pu=usm%403%2Csz%401320_2003%2Cta%40iphone_1_11.0_1_11.6/baiduid=F8EB1922487B57E4B9B568A60C98DEC3/w=10_10_/t=iphone/l=3/tc?ref=www_iphone&lid=11960810750480137704&order=7&fm=alop&tj=www_normal_7_10_10_title&vit=osres&m=8&srd=1&cltj=cloud_title&asres=1&nt=wnor&title=IP%E8%AF%A6%E8%A7%A3%E4%B9%8B%E7%8E%AF%E5%9B%9E%E6%8E%A5%E5%8F%A3-%E5%A4%A9%E4%B8%8B%E6%97%A0%E8%B4%BC-51CTO%E6%8A%80%E6%9C%AF%E5%8D%9A%E5%AE%A2&dict=20&w_qd=IlPT2AEptyoA_ykywg5csBqxE6NSn9G&sec=24112&di=075ab0d1b45165e2&bdenc=1&tch=124.115.331.1365.1.8&nsrc=IlPT2AEptyoA_yixCFOxXnANedT62v3IIQ3OLzlZ0DCbo93-hvvcXgErYSP50niNHoCb9jDNthcJxmGdWWAk7Bp_rbdmpK&eqid=a5fd5601a80ac0001000000359c2913c&wd=&clk_info=%7B%22srcid%22%3A%221599%22%2C%22tplname%22%3A%22www_normal%22%2C%22t%22%3A1505923439059%2C%22sig%22%3A%2250506%22%2C%22xpath%22%3A%22div-a-h3%22%7D&sfOpen=1",target:"_blank",rel:"noopener noreferrer"}},[e._v("环回地址 - 百度"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/dm_vincent/article/details/7714519",target:"_blank",rel:"noopener noreferrer"}},[e._v("拓扑排序的原理及其实现 - dm_vincent的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/ggggiqnypgjg/article/details/6645824",target:"_blank",rel:"noopener noreferrer"}},[e._v("Manacher算法--O(n)回文子串算法 - xuanflyer - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://transcoder.baiducontent.com/from=2001a/bd_page_type=1/ssid=0/uid=0/pu=usm%403%2Csz%401320_2003%2Cta%40iphone_1_10.3_1_11.6/baiduid=F8EB1922487B57E4B9B568A60C98DEC3/w=0_10_/t=iphone/l=3/tc?ref=www_iphone&lid=11323507255059474430&order=5&fm=alhm&h5ad=1&srd=1&dict=32&tj=h5_mobile_5_0_10_title&w_qd=IlPT2AEptyoA_yi8mgBQ&sec=23976&di=dc52c591f2efaf05&bdenc=1&tch=124.417.302.1209.1.403&nsrc=IlPT2AEptyoA_yixCFOxXnANedT62v3IEQGG_ytK1DK6mlrte4viZQRASDfpKHaMJICb9n00sqcIxn7c_G1e6so4g43&eqid=9d252dda9d60e8001000000559bb2586&wd=&clk_info=%7B%22srcid%22%3A%221599%22%2C%22tplname%22%3A%22h5_mobile%22%2C%22t%22%3A1505437070391%2C%22sig%22%3A%227417%22%2C%22xpath%22%3A%22div-a-h3%22%7D",target:"_blank",rel:"noopener noreferrer"}},[e._v("【转】二叉树、B树、B-树、B+树、B*树 - zhzhang - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/u013575812/article/details/50989966",target:"_blank",rel:"noopener noreferrer"}},[e._v("设计模式 之 单例模式 (C++ 懒汉经典实现 & DCL实现 & 饿汉经典实现) - 柠檬不加糖的博客 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/hackbuteer1/article/details/7460019",target:"_blank",rel:"noopener noreferrer"}},[e._v("C++中的单例模式 - Hackbuteer1的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/lg1259156776/article/details/52732879",target:"_blank",rel:"noopener noreferrer"}},[e._v("【C/C++】对于可重入、线程安全、异步信号安全几个概念的理解 - ZhangPY的专栏 - CSDN博客"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://www.cnblogs.com/czzju/archive/2013/02/14/2911190.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("B树、B-树、B+树、B*树详解(转) - 憨熊之家 - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://www.cnblogs.com/skywang12345/p/3245399.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("红黑树(一)之 原理和算法详细介绍 - 如果天空不死 - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://surlymo.iteye.com/blog/2082684",target:"_blank",rel:"noopener noreferrer"}},[e._v("分布式锁的三种实现方式 - - ITeye技术网站"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://www.cnblogs.com/zhangbaochong/p/5164994.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("平衡二叉树详解 - zhangbaochong - 博客园"),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"http://m.blog.csdn.net/article/details?id=52717078",target:"_blank",rel:"noopener noreferrer"}},[e._v("n个数中任意两个异或最大值"),t("OutboundLink")],1)])])}),[],!1,null,null,null);r.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/18.3b2b186e.js b/assets/js/18.3b2b186e.js new file mode 100644 index 0000000..b690f0a --- /dev/null +++ b/assets/js/18.3b2b186e.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[18],{601:function(v,_,t){"use strict";t.r(_);var p=t(15),a=Object(p.a)({},(function(){var v=this,_=v.$createElement,t=v._self._c||_;return t("ContentSlotsDistributor",{attrs:{"slot-key":v.$parent.slotKey}},[t("h1",{attrs:{id:"认识阶段"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#认识阶段"}},[v._v("#")]),v._v(" 认识阶段")]),v._v(" "),t("h2",{attrs:{id:"前言"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#前言"}},[v._v("#")]),v._v(" 前言")]),v._v(" "),t("p",[v._v("​\t方法:同学同事 朋友介绍 搭讪 社交软件 相亲")]),v._v(" "),t("p",[v._v("​\t目的:多认识女生 明确合适的类型 防止死胡同")]),v._v(" "),t("p",[v._v("​\t注意:心态崩溃 很容易喜欢一个女生并上心 容易患得患失 这是所有不会追女生的共同点")]),v._v(" "),t("p",[v._v("​\t认识人主要三点:资源 展示面 方法 最重要的是资源")]),v._v(" "),t("p",[v._v("​\t主流认识途径: 社交软件 搭讪")]),v._v(" "),t("p",[v._v("​ * 社交软件是当下认识女生最快的途径")]),v._v(" "),t("p",[v._v("​\t* 认识女生不代表不专一 而是要明确自己喜欢的类型")]),v._v(" "),t("h2",{attrs:{id:"社交软件-探探-积木-soul等"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#社交软件-探探-积木-soul等"}},[v._v("#")]),v._v(" 社交软件(探探 积木 soul等)")]),v._v(" "),t("p",[v._v("社交软件的关键:第一张照片(人帅 生活帅) 增加匹配率")]),v._v(" "),t("p",[v._v("如何用社交软件 要注意的细节")]),v._v(" "),t("p",[v._v("​\t第一张照片 做好 修一下 背景好 看清脸 后续兴趣爱好宠物 生活场景")]),v._v(" "),t("p",[v._v("​\t不要一直滑")]),v._v(" "),t("p",[v._v("​\t目的是要到微信 (可以说 我这个软件不常用 加个微信)")]),v._v(" "),t("p",[v._v("​\t不要聊太多")]),v._v(" "),t("p",[v._v("​\t不给就是没看上 下一个")]),v._v(" "),t("p",[v._v("​\t女生标注一上来就要微信的 都是老司机")]),v._v(" "),t("p",[v._v("​\t社交软件聊天不用太在意 要在意照片")]),v._v(" "),t("p",[v._v("​\t会员可以买")]),v._v(" "),t("p",[v._v("​\t不要发太多朋友圈")]),v._v(" "),t("p",[v._v("​\t资料认真填写")]),v._v(" "),t("p",[v._v("​\t照片可以约拍")]),v._v(" "),t("p",[v._v("​\t可以看其他竞争对手的照片")]),v._v(" "),t("h2",{attrs:{id:"如何搭讪"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#如何搭讪"}},[v._v("#")]),v._v(" 如何搭讪")]),v._v(" "),t("p",[v._v("也是一种提升和别人交流交往方式")]),v._v(" "),t("p",[v._v("主要是 状态 肢体语言 穿搭")]),v._v(" "),t("p",[v._v("搭讪的话术:")]),v._v(" "),t("p",[v._v("​\t“我在这附近逛街看到你了 我想和你认识一下 留个微信吧”")]),v._v(" "),t("p",[v._v("​\t\t直接给")]),v._v(" "),t("p",[v._v("​\t\t犹豫害羞可以坚持一下:“我没有什么其他意思 就是想认识一下 你扫我一下”")]),v._v(" "),t("p",[v._v("​\t\t不想给:不强求")]),v._v(" "),t("p",[v._v("容易犯的错误:")]),v._v(" "),t("p",[v._v("​\t搭讪前不要被看到 从身后绕")]),v._v(" "),t("p",[v._v("​\t拍一下女生肩膀 同时说你好 要适中")]),v._v(" "),t("p",[v._v("​\t保持一米")]),v._v(" "),t("p",[v._v("​\t等对方看到你的眼睛后再开始说话")]),v._v(" "),t("p",[v._v("​\t说话要慢慢说")]),v._v(" "),t("p",[v._v("​\t不要有小动作")]),v._v(" "),t("p",[v._v("​\t真诚 不要油嘴滑舌")]),v._v(" "),t("p",[v._v("​\t有闺蜜的也要打招呼")]),v._v(" "),t("p",[v._v("三步:")]),v._v(" "),t("p",[v._v("​\t克服紧张 不在意女生是谁 只要不停的搭讪 不在意结果")]),v._v(" "),t("p",[v._v("​\t练习自己的说话和肢体语言")]),v._v(" "),t("p",[v._v("​\t尽量多的说话 能说多久说多久")])])}),[],!1,null,null,null);_.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/19.876eee7d.js b/assets/js/19.876eee7d.js new file mode 100644 index 0000000..363048d --- /dev/null +++ b/assets/js/19.876eee7d.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[19],{599:function(t,v,_){"use strict";_.r(v);var p=_(15),a=Object(p.a)({},(function(){var t=this,v=t.$createElement,_=t._self._c||v;return _("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[_("h1",{attrs:{id:"熟悉阶段"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#熟悉阶段"}},[t._v("#")]),t._v(" 熟悉阶段")]),t._v(" "),_("h2",{attrs:{id:"前言"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#前言"}},[t._v("#")]),t._v(" 前言")]),t._v(" "),_("p",[t._v("​\t目的:让别人感觉你踏实 知道你是干什么的 大概是一个什么样的人")]),t._v(" "),_("p",[t._v("​\t注意:不熟悉属于无效聊天 可以适当幽默 不要想升高提升关系")]),t._v(" "),_("p",[t._v("​\t方法:真诚和踏实")]),t._v(" "),_("p",[t._v("要有目的的聊天 有目的的熟悉可以在十几分钟 不能无效聊天 女生放下手机 还能想起是什么人 建立基本的安全感 是个正常人 对我们有了关注 会看朋友圈")]),t._v(" "),_("p",[t._v("熟悉的三要素:")]),t._v(" "),_("p",[t._v("​\t让女生感觉到你说一个什么人(IT 宅男 文艺 工科男 工科男 创业者)印象 把感觉给到女生 大概是什么人")]),t._v(" "),_("p",[t._v("(我们班有个同学 特别调皮 成绩也还不错 这学期和别人打了三次架 是老师办公室的常客)")]),t._v(" "),_("p",[t._v("​\t大概了解她是什么人 做什么工作 多大年纪 有什么学历 了解基本信息 深入聊天")]),t._v(" "),_("p",[t._v("​\t聊聊女生感兴趣的话题 好吃好玩 明星综艺八卦")]),t._v(" "),_("p",[t._v("安全感的基础")]),t._v(" "),_("p",[t._v("​\t让别人感觉你踏实 知道你是干什么的 大概是一个什么样的人")]),t._v(" "),_("h2",{attrs:{id:"第一次聊天的步骤-踏实-稳重"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#第一次聊天的步骤-踏实-稳重"}},[t._v("#")]),t._v(" 第一次聊天的步骤 踏实 稳重")]),t._v(" "),_("p",[t._v("​\t寒暄 吃了吗 衣服好看 (刚下飞机 累死了 躺床上 抽根烟 休息一下)")]),t._v(" "),_("p",[t._v("​\t\t拉好聊氛围 老朋友 熟悉的气氛 搞笑的表情包 幽默开场白 一两句就行")]),t._v(" "),_("p",[t._v("​\t\t\t你好 正经正经 幽默对幽默")]),t._v(" "),_("p",[t._v("​\t\t\t朋友圈找信息 生活故事 表示自己状态 阳台吹风")]),t._v(" "),_("p",[t._v("​")]),t._v(" "),_("p",[t._v("​\tdhv 高价值 有价值的地方 留下印象")]),t._v(" "),_("p",[t._v("​\t\t快速的自我介绍")]),t._v(" "),_("p",[t._v("​\t\t(我是有个心理咨询师 别人情感 的 曾经有一个学员 找我心理辅导 停不下来了怎么这么的)")]),t._v(" "),_("p",[t._v("​\t\t(我是有个程序员 出差半年的程序员)")]),t._v(" "),_("p",[t._v("​\t\t有趣的事情")]),t._v(" "),_("p",[t._v("​\t\tdhv 不要说消极描述工作两点一线 说工程师 喜欢爱好 稍微包装")]),t._v(" "),_("p",[t._v("​\t信息互换")]),t._v(" "),_("p",[t._v("​\t\t不能问太多 最多三个")]),t._v(" "),_("p",[t._v("​\t\t问核心问题 先说自己 再问别人")]),t._v(" "),_("p",[t._v("​\t\t职业 年龄 学历 城市地域 了解大致是什么人")]),t._v(" "),_("p",[t._v("​\t\t说话要圆润一点 (你多大啊 我感觉 我比你大 ) 前面可以不问名字")]),t._v(" "),_("p",[t._v("​\t女生感兴趣的话题")]),t._v(" "),_("p",[t._v("​\t\t男生和女生基本没有共同话题的")]),t._v(" "),_("p",[t._v("​\t\t聊女生感兴趣的话题 朋友圈 星座八卦 吃的 玩的 宠物明星")]),t._v(" "),_("p",[t._v("​\t\t要有情绪的互动 找到感兴趣的点 或者共通的话题")]),t._v(" "),_("p",[t._v("​\t\t(看到小孩 可以夸可爱 问为什么乖 激发分享欲)")]),t._v(" "),_("p",[t._v("​\t\t聊热点信息")])])}),[],!1,null,null,null);v.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/20.9e432406.js b/assets/js/20.9e432406.js new file mode 100644 index 0000000..fb679bd --- /dev/null +++ b/assets/js/20.9e432406.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[20],{600:function(v,_,t){"use strict";t.r(_);var p=t(15),a=Object(p.a)({},(function(){var v=this,_=v.$createElement,t=v._self._c||_;return t("ContentSlotsDistributor",{attrs:{"slot-key":v.$parent.slotKey}},[t("h1",{attrs:{id:"吸引阶段"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#吸引阶段"}},[v._v("#")]),v._v(" 吸引阶段")]),v._v(" "),t("p",[v._v("​\t吸引:吸引是女生愿意和你接触的原神动力 能配得上对方")]),v._v(" "),t("p",[v._v("​\t\t外形 价值 情绪三个吸引")]),v._v(" "),t("p",[v._v("​\t目的:让对方知道你是个猎人 优秀有能力的人 (事业成功 社交圈广 朋友多 物质条件优秀 自身条件好 生活有品位情调)")]),v._v(" "),t("p",[v._v("​\t注意:无吸引无追求 靠吸引而不是靠追")]),v._v(" "),t("p",[v._v("​\t方法:吸引就是高价值展示 做两种感觉被撩与害羞")]),v._v(" "),t("h2",{attrs:{id:"猎人-有能力的男人-有高价值的男人"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#猎人-有能力的男人-有高价值的男人"}},[v._v("#")]),v._v(" 猎人 有能力的男人 有高价值的男人")]),v._v(" "),t("p",[v._v("​\t繁衍价值")]),v._v(" "),t("p",[v._v("​\t\t高帅 身体强壮健康 年轻女生更喜欢高帅 大一点的喜欢有能力的")]),v._v(" "),t("p",[v._v("​\t生存价值")]),v._v(" "),t("p",[v._v("​\t\t外在 车房钱")]),v._v(" "),t("p",[v._v("​\t\t内在 优秀男人的特质 拼搏 进取 乐观 不屈不挠 有智慧 有内涵 有知识")]),v._v(" "),t("p",[v._v("怎么做")]),v._v(" "),t("p",[v._v("​\t高价值展示 朋友圈 工作生活兴趣爱好 展现自己的价值")]),v._v(" "),t("p",[v._v("​\t见面的形象 语言")]),v._v(" "),t("p",[v._v("建立吸引后下一步")]),v._v(" "),t("p",[v._v("​\t确认建立吸引 服从性测试 要电话 要照片 打电话起床")]),v._v(" "),t("p",[v._v("无吸引无追求")]),v._v(" "),t("p",[v._v("​\t没有建立起吸引的时候 暴露需求感会减低女人的吸引")]),v._v(" "),t("p",[v._v("​\t不要追求的事")]),v._v(" "),t("h2",{attrs:{id:"吸引的两种感觉-什么是两种感觉-tf-暧昧聊天"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#吸引的两种感觉-什么是两种感觉-tf-暧昧聊天"}},[v._v("#")]),v._v(" 吸引的两种感觉 什么是两种感觉 TF 暧昧聊天")]),v._v(" "),t("p",[v._v("​\t被撩的感觉BL 害羞的感觉FS")]),v._v(" "),t("p",[v._v("​\t撩BL 有好感才做 反馈一般的一点点 反馈不好的不要撩")]),v._v(" "),t("p",[v._v("​\t害羞FS 只能对反馈好的女生做")]),v._v(" "),t("p",[v._v("​\t做到想象 情景 有代入感 (和我谈恋爱的感觉一定很幸福吧)")]),v._v(" "),t("h2",{attrs:{id:"吸引的形象-想象就是繁育价值"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#吸引的形象-想象就是繁育价值"}},[v._v("#")]),v._v(" 吸引的形象 想象就是繁育价值")]),v._v(" "),t("p",[v._v("​\t第一印象很重要 类似投简历时的学历 形象判断人")]),v._v(" "),t("p",[v._v("​\t形象判断一个人的价值")]),v._v(" "),t("p",[v._v("​\t发型 穿着 肢体语言")]),v._v(" "),t("p",[v._v("​\t大众点评大店 根据脸型做一个发型 拍个照片照样子剪")]),v._v(" "),t("p",[v._v("​\t\t定型喷雾 发蜡 发胶 约会准备")]),v._v(" "),t("p",[v._v("​\t\t护肤 洁面 水乳")]),v._v(" "),t("p",[v._v("​\t服装 小红书")]),v._v(" "),t("p",[v._v("​\t模仿偶像 胡歌 和自身身份相符的")]),v._v(" "),t("h2",{attrs:{id:"吸引的展示面"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#吸引的展示面"}},[v._v("#")]),v._v(" 吸引的展示面")]),v._v(" "),t("p",[v._v("​\t昵称 头像 前面 墙 朋友圈")]),v._v(" "),t("p",[v._v("​\t昵称 不要非主流")]),v._v(" "),t("p",[v._v("​\t头像不要 风景照 证件照 宠物 卡通 网图 画质差照片")]),v._v(" "),t("p",[v._v("​\t\t任务缩小 视觉中心不要人物而是环境 网红背景 不要全脸要神秘")]),v._v(" "),t("p",[v._v("​\t朋友圈封面 广告位")]),v._v(" "),t("p",[v._v("​\t\t不要 网图 大头自拍 不要旅游照 风景照 要展示价值 品质生活照")]),v._v(" "),t("p",[v._v("​\t签名 有内涵")]),v._v(" "),t("p",[v._v("​\t朋友圈 不要转发鸡汤 没有自己的生活 纯文字 优秀的朋友 环境")]),v._v(" "),t("p",[v._v("​\t\t不要工作广告分组转发 专业的东西")]),v._v(" "),t("p",[v._v("​\t\t美食 娱乐生活 上进 愿意投资自己的人 宠物和小朋友也是好的")]),v._v(" "),t("p",[v._v("​\t\t和很多别的女性朋友照片 努力工作")]),v._v(" "),t("p",[v._v("​\t\t朋友圈配文 要少")]),v._v(" "),t("p",[v._v("​\t\t音乐分享")]),v._v(" "),t("p",[v._v("​\t门面 社交软件第一印象")]),v._v(" "),t("p",[v._v("​\t展示面是自己的窗口 名片 不是日记本")]),v._v(" "),t("p",[v._v("​\t\t社交软件 展示出来的状态")]),v._v(" "),t("p",[v._v("​\t展示面差女生一开始就不想聊了")]),v._v(" "),t("p",[v._v("​\t展示面是吸引的关键")]),v._v(" "),t("p",[v._v("​\t\t看朋友圈的几秒抓住女生")]),v._v(" "),t("p",[v._v("​\t做好头像和背景墙")]),v._v(" "),t("p",[v._v("​\t\t头像 不要用明星宠物")]),v._v(" "),t("p",[v._v("​\t\t要用自己的真是照片 露出正脸 发型 表情 独照 半身照 背景简洁")]),v._v(" "),t("p",[v._v("​\t\t背景图 全身照 环境不错的地方")]),v._v(" "),t("p",[v._v("​\t多角度展示自己的高价值")]),v._v(" "),t("p",[v._v("​\t\t看到自己的价值 要有自己的生活 接触有意思的东西")]),v._v(" "),t("p",[v._v("​\t\t展示面照片 工作 兴趣 生活 一定要展现自己的正能量 对生活的热爱")]),v._v(" "),t("p",[v._v("​\t\t看小红书这么拍生活照")]),v._v(" "),t("p",[v._v("​\t\t精致的生活 高价值的圈子 不要过多散发多愁善感")]),v._v(" "),t("p",[v._v("​\t不要发负能量的东西")])])}),[],!1,null,null,null);_.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/21.b160f907.js b/assets/js/21.b160f907.js new file mode 100644 index 0000000..a58bf37 --- /dev/null +++ b/assets/js/21.b160f907.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[21],{604:function(t,v,_){"use strict";_.r(v);var a=_(15),r=Object(a.a)({},(function(){var t=this,v=t.$createElement,_=t._self._c||v;return _("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[_("h1",{attrs:{id:"约会"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#约会"}},[t._v("#")]),t._v(" 约会")]),t._v(" "),_("p",[t._v("​\t关键的约会牵手S1 亲吻S2")]),t._v(" "),_("h2",{attrs:{id:"注意流程和场地选择"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#注意流程和场地选择"}},[t._v("#")]),t._v(" 注意流程和场地选择")]),t._v(" "),_("p",[t._v("​\t约会中的好感:场地40% 见面前的反馈30% 约会中的30% (失败的外部应数是很大的)")]),t._v(" "),_("h2",{attrs:{id:"阶段"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#阶段"}},[t._v("#")]),t._v(" 阶段")]),t._v(" "),_("p",[t._v("​\t第一次约会去互动性强的地方好玩的地方 场地逼格要高 环境好")]),t._v(" "),_("p",[t._v("​\tS1 好玩的地方文艺的环境好")]),t._v(" "),_("p",[t._v("​\tS2 文艺的环境好 半私密空间")]),t._v(" "),_("h2",{attrs:{id:"转场很重要-一定要转场-最好三次-充实"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#转场很重要-一定要转场-最好三次-充实"}},[t._v("#")]),t._v(" 转场很重要 一定要转场 最好三次 充实")]),t._v(" "),_("p",[t._v("​\t第一次 奶茶店 餐厅聊天半小时 吃饭")]),t._v(" "),_("p",[t._v("​\t第二次 娃娃机 电玩 旋转木马 互动的地方")]),t._v(" "),_("p",[t._v("​\t第三次 电影院 聊天")]),t._v(" "),_("h2",{attrs:{id:"约会需要提前了解"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#约会需要提前了解"}},[t._v("#")]),t._v(" 约会需要提前了解")]),t._v(" "),_("p",[t._v("​\t约会的场所 目的")]),t._v(" "),_("p",[t._v("​\t哪里的东西便宜好吃 环境好")]),t._v(" "),_("p",[t._v("​\t哪里适合牵手逛街")]),t._v(" "),_("p",[t._v("​\t哪家私人影院")]),t._v(" "),_("p",[t._v("​\t哪心情不好适合坐一坐的小河边")]),t._v(" "),_("p",[t._v("​\t哪家清吧价格不贵音乐好听 逼格还挺高")]),t._v(" "),_("p",[t._v("​\t哪里的娃娃机很新 娃娃好看 放机器的商场很高档")]),t._v(" "),_("p",[t._v("​\t哪里的艺术展 最近有什么")]),t._v(" "),_("p",[t._v("​\t哪里的阳光好的咖啡厅吗")]),t._v(" "),_("p",[t._v("​\t不要随便找 要花点心思 大众点评 小红书 实际看一下")]),t._v(" "),_("p",[t._v("​\t地道的小吃 便宜还好吃 没来过")]),t._v(" "),_("p",[t._v("​\t好玩的 娃娃机 碰碰车 划船 烧烤 风筝 郊游 农家乐 温泉 鬼屋 密室 桌游 电影 唱歌机 酒吧 ktv 水上乐园 游乐场 游泳池")]),t._v(" "),_("p",[t._v("​\t文艺的 陶艺学习 双人烘焙 手工 艺术展 绘画体验 情人坡 情人湾 宁静小河边 艺术社区 图书馆 私人影院 旋转木马 摩天轮 清吧 踩单车 羽毛球馆 散步 跳舞")]),t._v(" "),_("p",[t._v("​\t有逼格的 网红下午茶 咖啡厅 骑马 高尔夫 五星级酒店走廊 旅游")]),t._v(" "),_("p",[t._v("​\t小红书 下午茶 骑马 卡丁车")]),t._v(" "),_("h2",{attrs:{id:"约会可以的流程"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#约会可以的流程"}},[t._v("#")]),t._v(" 约会可以的流程")]),t._v(" "),_("p",[t._v("加上微信后聊天不要超过三天 年龄 兴趣 爱好 工作"),_("br"),t._v("\n第一次 咖啡馆 奶茶店 看外貌 谈吐气质 了解思维方式和表达能力 感觉不错再去吃饭\n第二次 去游乐场和密室 看应变能力 对未知项目的开拓\n第三次 去打羽毛球 或其他运动 看默契程度\n第四次 去博物馆 去一些文创类地方 看品味和审美\n第五次 看消费观 帮对方挑选衣服")])])}),[],!1,null,null,null);v.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/22.b98bdf43.js b/assets/js/22.b98bdf43.js new file mode 100644 index 0000000..150780e --- /dev/null +++ b/assets/js/22.b98bdf43.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[22],{605:function(n,v,_){"use strict";_.r(v);var p=_(15),t=Object(p.a)({},(function(){var n=this,v=n.$createElement,_=n._self._c||v;return _("ContentSlotsDistributor",{attrs:{"slot-key":n.$parent.slotKey}},[_("h2",{attrs:{id:"亚瑟·阿伦三十六问"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#亚瑟·阿伦三十六问"}},[n._v("#")]),n._v(" 亚瑟·阿伦三十六问")]),n._v(" "),_("p",[n._v("1、在这个世界上,如果你可以选择一个人跟你共进晚餐,你会选择谁?")]),n._v(" "),_("p",[n._v("2、你有想过出名吗?通过什么方式?")]),n._v(" "),_("p",[n._v("3、在打电话前,你一般会练习怎么去表达吗?为什么?")]),n._v(" "),_("p",[n._v("4、你觉得在你的心里,完美的一天是什么样子?")]),n._v(" "),_("p",[n._v("5、你上一次一个人唱歌是什么时候呢?对其他人唱歌呢?")]),n._v(" "),_("p",[n._v("6、假设你可以活到90岁,那么在30岁后,你更倾向于身体年轻还是思想年轻,来躲过余下的60年呢?")]),n._v(" "),_("p",[n._v("7、你对你以后怎样死去,有没有预感?")]),n._v(" "),_("p",[n._v("8、说一下我们的三个共同点。")]),n._v(" "),_("p",[n._v("9、你这辈子最感激的是谁,或者是什么事?")]),n._v(" "),_("p",[n._v("10、如果你能改变你过去的经历,你想改变那件事?")]),n._v(" "),_("p",[n._v("11、用四分钟,尽可能详细的讲讲你从小到大的经历。")]),n._v(" "),_("p",[n._v("12、如果你明天醒来会获得一种新的才能,你希望是什么。")]),n._v(" "),_("p",[n._v("13、如果水晶球能告诉你关于你自己、你的生活、未来或其他任何事情的真相,你希望知道什么?")]),n._v(" "),_("p",[n._v("14、有没有长时间梦寐以求的事情,为什么你没有去实现?")]),n._v(" "),_("p",[n._v("15、你觉得自己最成功的是什么?")]),n._v(" "),_("p",[n._v("16、你觉得有用最珍贵的地方是什么?")]),n._v(" "),_("p",[n._v("17、你最宝贵的记忆是什么?")]),n._v(" "),_("p",[n._v("18、你最可怕的记忆是什么?")]),n._v(" "),_("p",[n._v("19、假设一年后你会突然去世,那么你会改变现在的生活方式吗?为什么?")]),n._v(" "),_("p",[n._v("20、友谊对于你来说意味着什么?")]),n._v(" "),_("p",[n._v("21、爱情和喜欢,在你生活中大概是什么样的角色?")]),n._v(" "),_("p",[n._v("22、说出5个关于我的好的特质。我也说5个关于你的。")]),n._v(" "),_("p",[n._v("23、你家里人之间亲密吗?你是不是觉得你的童年比其他大多数人更幸福?")]),n._v(" "),_("p",[n._v("24、你觉得你和你密码的关系是怎么样?")]),n._v(" "),_("p",[n._v("25、各种做三个围绕“我们”的事实陈述。例如,“我们在深夜一起聊天”。。。")]),n._v(" "),_("p",[n._v("26、给你一句句子,你把它补全:”我希望能有人和我一起分享。。。“")]),n._v(" "),_("p",[n._v("27、如果你要和我成为球迷的朋友,对你来说,最需要知道关于我的事情是什么?")]),n._v(" "),_("p",[n._v("28、告诉我你喜欢我什么;这次要非常诚实哦。")]),n._v(" "),_("p",[n._v("29、和我分享一件生活种令你尴尬的事情,可以是最近的事情。")]),n._v(" "),_("p",[n._v("30、你上次在别人面前哭是什么事情?那独自流泪是什么时候呢?")]),n._v(" "),_("p",[n._v("31、告诉我,我有哪些地方已经放你开始喜欢上了。")]),n._v(" "),_("p",[n._v("32、对你来说,有没有一些事严肃道不能开玩笑?")]),n._v(" "),_("p",[n._v("33、假设你今晚就要死了,而你再也没有机会和其他人甲流,那你最后悔没有告诉别人什么事?为什么还没有告诉他们。")]),n._v(" "),_("p",[n._v("34、你的房子着火了,你的所有东西都在里面,在救出你的亲人和宠物后,你有时间进去最后一次冲进去安全的救出最后一件物品,那将会是什么?为什么?")]),n._v(" "),_("p",[n._v("35、在你所有家人中,谁的离去最令你痛苦,为什么?")]),n._v(" "),_("p",[n._v("36、说一个你自己私人遇到的困扰,你说完我也说我的,然后我们互相给对方想办法。")]),n._v(" "),_("h2",{attrs:{id:"话题互相了解对方"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#话题互相了解对方"}},[n._v("#")]),n._v(" 话题互相了解对方")]),n._v(" "),_("p",[n._v("吃过最好吃的东西是什么\n目前最想做的事\n最想和对方做的事\n两个人的共同爱好\n讨论自己的兴趣爱好\n谈谈对方性格中的缺点\n最喜欢对方的哪—点\n遇见对方前是什么状态\n聊一聊初见对方的印象\n做过最让对方感动的事\n做过最浪漫的事\n做过最蠢的事\n生气时怎么解决问题\n对方最不好的习惯\n最欣赏对方的一点\n经历的最开心的事\n普及自己的兴趣爱好\n分享喝多后做过的糗事\n分享自己的旅行经历\n分享自己内心的小秘密\n分享做过最尴尬的事\n分享每天发生的趣事\n吐槽工作的烦恼\n最讨厌吃的东西是什么\n最喜欢的歌手是谁\n印象最深刻的一件事\n在一起后的幸福瞬间\n聊聊儿时的梦想\n儿时的学习状况\n最喜欢的动画片\n最怕的东西是什么\n想要拥有什么样的超能力\n疲惫的时候怎么放松自己\n当你陷入困境时你会向谁请教\n因为什么事情跟父母吵过架\n人生目前最大的成就是什么\n最近一次哭是什么时候为什么\n小时候的梦相是什么\n喜欢独处吗\n如果中了500万,你会怎么规划\n如果你打算写本书,你会写什么内容\n单曲循环最久的歌是哪一首\n想唱给对方的歌\n分享彼此的奇葩朋友\n遇到最难忘的囧事\n小时候怕爸爸还是妈妈\n我做过哪件事情让你很生气你\n是如何察觉我在生气的\n最喜欢吃的一道菜\n最想去哪个地方\n我让你难堪过吗\n喜欢什么游戏/音乐/电影/花/水果")]),n._v(" "),_("p",[n._v("9.你对彼此忠诚的定义是什么?\n10.给爱情下个定义?\n11.浪漫的度假作为你生活方式的一部分,你有何感受?\n12.你会因为一个什么样的小细节而对—个女人动心?\n13.你认为钱最主要的功能是?\n14.在什么样的情况下,你会放弃原则?\n15.你曾犯下的最大的措误是什么?它是如何改变你人生的?")]),n._v(" "),_("h2",{attrs:{id:"暧昧阶段"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#暧昧阶段"}},[n._v("#")]),n._v(" 暧昧阶段")]),n._v(" "),_("p",[n._v("这个阶段往往有过务次约会,彼此都有想进步的起法,再通过相对私密话题了解对方对感情的态度,否是合适的人?\n9.你喜欢什么样的工作环境?\n10.你最欣赏什么样的人?\n11.是否对自己的工作满意?\n12.喜欢独处么?\n13.平常去哪儿玩?\n14.最想去哪个城市工作?\n15.当你对某人有偏见时,你是怎么想的?\n16.你最好的脆友是谁?为什么?\n17.你是如何选择现在这项事业的?")]),n._v(" "),_("h2",{attrs:{id:"恋爱阶段"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#恋爱阶段"}},[n._v("#")]),n._v(" 恋爱阶段")]),n._v(" "),_("p",[n._v("如果以上话题你都史经解锁成功,而说明你们的关系就基本可我确定下来,接下来就是好好读恋爱培养感情让关系\n更稳定\n1.告诉我,你是何时发觉爱上我的?\n2.如果我想在生日.上给你一个惊喜.你希望是什么?\n3.你想要的完美爱情是什么样的?\n4.的有想过你30岁之后的人生会是什么样子么?\n5.我会是你值得信任的人吗?\n6.如果金钱不再是目标.你最大的追求会是什么?")])])}),[],!1,null,null,null);v.default=t.exports}}]); \ No newline at end of file diff --git a/assets/js/23.c61a42c5.js b/assets/js/23.c61a42c5.js new file mode 100644 index 0000000..8a24082 --- /dev/null +++ b/assets/js/23.c61a42c5.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[23],{603:function(v,_,p){"use strict";p.r(_);var e=p(15),t=Object(e.a)({},(function(){var v=this,_=v.$createElement,p=v._self._c||_;return p("ContentSlotsDistributor",{attrs:{"slot-key":v.$parent.slotKey}},[p("p",[v._v("22020年09月18日星期五16:52:45 CST")]),v._v(" "),p("p",[v._v("1、做个简单的自我介绍")]),v._v(" "),p("p",[v._v("2.这个项目都是多少个人做的?")]),v._v(" "),p("p",[v._v("3.后端就你一个人做的吗?")]),v._v(" "),p("p",[v._v("4.项目做了多久?")]),v._v(" "),p("p",[v._v("5.说一说项目中困扰你时间比较长的问题?")]),v._v(" "),p("p",[v._v("6.项目中你试花在搭建环境的时间比较长是吗?(我说了很多关于服务器代码是如何实现的,原理是什么)")]),v._v(" "),p("p",[v._v("7.用了2个nginx具体是如何做高可用的")]),v._v(" "),p("p",[v._v("8.2个nginx都是回同时使用的吗?还是只是使用其中一个")]),v._v(" "),p("p",[v._v("9.用的2个ip给前端使用是吗?部署在不同的机器上面吗?")]),v._v(" "),p("p",[v._v("10.有了解过,用一个ip可以使多个nginx相互切换,例如其中一个nginx异常,是要访问另外一个ip是吗")]),v._v(" "),p("p",[v._v("11.有了解过虚拟ip这个东西呢?")]),v._v(" "),p("p",[v._v("12.nginx配置的是用什么样的负载均衡算法?")]),v._v(" "),p("p",[v._v("13.有了解过哪些负载均衡算法呢?")]),v._v(" "),p("p",[v._v("14.知道nginx是如何做负载均衡的吗?(我提到nginx中的线程池和epoll )")]),v._v(" "),p("p",[v._v("15.服务器是如何在多个副本中进行数据同步的?")]),v._v(" "),p("p",[v._v("16.知道原理细节吗?")]),v._v(" "),p("p",[v._v("17.现在的部署下,在什么故障下,服务器能够正常使用?")]),v._v(" "),p("p",[v._v("18.只实现了读的高可用,写方面没有实现高可用是吗?")]),v._v(" "),p("p",[v._v("19.fastdfs在写数据上能不能也做高可用?")]),v._v(" "),p("p",[v._v("20.有没有了解过其他分布式存储的东西呢?(我说对网络编程,tcp,网络的原理会熟悉一些)")]),v._v(" "),p("p",[v._v("21.什么情况下做东西线程通信?")]),v._v(" "),p("p",[v._v("22.单线程非阻塞有什么问题吗?")]),v._v(" "),p("p",[v._v("23.让你设计一个网络工具,你会用多线程同步阻塞的方式吗?")]),v._v(" "),p("p",[v._v("24.说一下你对epoll的了解?")]),v._v(" "),p("p",[v._v("25.说一下select的区别?")]),v._v(" "),p("p",[v._v("26.什么情况下适合用select,什么情况下适合使用epoll ?")]),v._v(" "),p("p",[v._v("27.为什么1024个连接的时候适合用select ?")]),v._v(" "),p("p",[v._v("28.为什么你认为select适合做1024个以下的连接?")]),v._v(" "),p("p",[v._v("29.平时select和 epoll都有写过吗?(我提到reactor)")]),v._v(" "),p("p",[v._v("30.说一下reactor和preactor的区别?")]),v._v(" "),p("p",[v._v("31.先说一下select是不是reactor ?")]),v._v(" "),p("p",[v._v("32.你是说epoll是同步的方式,reactor是异步的方式吗?")]),v._v(" "),p("p",[v._v("33.reactor这个概念你是从哪里了解到的?")]),v._v(" "),p("p",[v._v("34.一般搜索东西是在哪里搜索?")]),v._v(" "),p("p",[v._v("35.直接上csdn上面搜索吗?")]),v._v(" "),p("p",[v._v("36.为什么不直接用google搜索吗?是因为csdn上面搜索的东西比较适合你看吗?")]),v._v(" "),p("p",[v._v("37.你用epoll是来实现个什么东西?是应用还是练习?")]),v._v(" "),p("p",[v._v("38.关于epoll中处理数据的时候,你是如何处理的?")]),v._v(" "),p("p",[v._v("39.epoll的边沿触发和水平触发了解吗?")]),v._v(" "),p("p",[v._v("40.在使用上你是如何用边沿触发还是水平触发的?")]),v._v(" "),p("p",[v._v("41.如何设置边沿触发和水平触发的?")]),v._v(" "),p("p",[v._v("42.数据处理上是如何设计的?")]),v._v(" "),p("p",[v._v("43.以前有写过聊天室之类的通信呢?协议是如何设计的?")]),v._v(" "),p("p",[v._v("44.聊天室是你大学的时候做的吗?")]),v._v(" "),p("p",[v._v("45.你写socket变成的话,你试如何处理这些接口的错误的?")]),v._v(" "),p("p",[v._v("46.recv返回-1的话就是错误吗?")]),v._v(" "),p("p",[v._v("47.工作中为什么要用redis做这个token呢?")]),v._v(" "),p("p",[v._v("48.redis有了解过是如何做持久化的呢?")]),v._v(" "),p("p",[v._v("49.redis数据结构有了解哪些呢?")]),v._v(" "),p("p",[v._v("50.有序的set是如何实现的?")]),v._v(" "),p("p",[v._v("51.在这个公司还有别的工作体现你的水平的东西吗?")]),v._v(" "),p("p",[v._v("52.看你有用mmap,说一下mmap是什么?")]),v._v(" "),p("p",[v._v("53.你觉得哪些场景可以用mmap ?(我说了开发板的屏幕映射)")]),v._v(" "),p("p",[v._v("54.做软件开发的时候什么时候会用到mmap ?(我说了netmap用户态协议栈)")]),v._v(" "),p("p",[v._v("55.共享内存有了解过吗? linux一般如何去实现共享内存的?(shm)")]),v._v(" "),p("p",[v._v("56.你的主要开发语言是c/c是吧?平时写c多还是c ?")]),v._v(" "),p("p",[v._v("57.c11了解吗?平时你们使用的是c11吗还是老版本?")]),v._v(" "),p("p",[v._v("58.智能指针有了解吗?(我说 auto ptr ,unique ptr , shared ptr , weak ptr )")]),v._v(" "),p("p",[v._v("59.说一下上述智能指针的区别?")]),v._v(" "),p("p",[v._v("60.平时有用过哪一些指针?")]),v._v(" "),p("p",[v._v("61.C++里面右值引用什么意思?")]),v._v(" "),p("p",[v._v("62.多态是如何实现的?核心原理是什么?")]),v._v(" "),p("p",[v._v("63.你们平时如何去定位内存泄露的问题?")]),v._v(" "),p("p",[v._v("64.你是基本只做c/c++语言是吧?")]),v._v(" "),p("p",[v._v("65.第一家公司是做什么工作的呢?")]),v._v(" "),p("p",[v._v("66.你为什么会选择离开第一家公司呢?")]),v._v(" "),p("p",[v._v("67.为什么会离开第二家公司呢?")]),v._v(" "),p("p",[v._v("68.为什么毕业的时候会选择第一家做机顶盒的公司呢?")]),v._v(" "),p("p",[v._v("69.毕业找工作的时候有其他的offer选择呢?")]),v._v(" "),p("p",[v._v("70.大学的时候就是做嵌入式吗?")]),v._v(" "),p("p",[v._v("71.那你对游戏行业有了解过吗?了解多少?")]),v._v(" "),p("p",[v._v("72.你为什么会投游戏行业呢?对游戏后台了解吗?")]),v._v(" "),p("p",[v._v("73.对音视频哪些了解过吗?")]),v._v(" "),p("p",[v._v("74.平时玩游戏吗?")]),v._v(" "),p("p",[v._v("75.你现在找工作是只要是后端就可以是吧?游戏后端可以?音视频后端?服务器后端?都是有兴趣的是吧?")]),v._v(" "),p("p",[v._v("76.平时会通过什么样的途径去学习呢?")]),v._v(" "),p("p",[v._v("77.你平时一般看书多—些呢?还是上网看博客,看视屏多一些?")]),v._v(" "),p("p",[v._v("78.你最近在学的是什么呢?(我说有在学用户态协议栈的一些东西,netmap")]),v._v(" "),p("p",[v._v("79.是指tcp/ip协议吗?http协议哪些吗?(我大概说来一下netmap的原理)")]),v._v(" "),p("p",[v._v("80.说到拷贝的话,0拷贝这些有了解过吗?")]),v._v(" "),p("p",[v._v("81.还有了解到别的0拷贝的应用吗?")]),v._v(" "),p("p",[v._v("82.你现在工作是要加班吗?几点到几点?(每天都是10点,11点以后)")]),v._v(" "),p("p",[v._v("83.你们业务开发很多吗?你一般事情做完了会是几点?你对工作时间是如何看的?")]),v._v(" "),p("p",[v._v("84.长期10点多和11点多下班的话,个人能坚持吗?能接受吗?")]),v._v(" "),p("p",[v._v("85.平时周末或者节假日突然需要修bug的时候有吗?")]),v._v(" "),p("p",[v._v("86.你现在有女朋友吗?在那里?")]),v._v(" "),p("p",[v._v("87.你是哪里人?你现在在广州哪里?")]),v._v(" "),p("p",[v._v("88.你了解过我们公司的位置吗?")])])}),[],!1,null,null,null);_.default=t.exports}}]); \ No newline at end of file diff --git a/assets/js/24.3e59a9da.js b/assets/js/24.3e59a9da.js new file mode 100644 index 0000000..17e671e --- /dev/null +++ b/assets/js/24.3e59a9da.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[24],{606:function(v,_,p){"use strict";p.r(_);var t=p(15),e=Object(t.a)({},(function(){var v=this,_=v.$createElement,p=v._self._c||_;return p("ContentSlotsDistributor",{attrs:{"slot-key":v.$parent.slotKey}},[p("p",[v._v("深信服网络安全2020年09月14日星期一12:47:05 CST")]),v._v(" "),p("p",[v._v("1.简单的介绍一下自己擅长的技能")]),v._v(" "),p("p",[v._v("2.工作中主要还是做c/c++是吗?json也是用c/C++写的吗?")]),v._v(" "),p("p",[v._v("3.c/C+ + static的使用场景是什么?")]),v._v(" "),p("p",[v._v("4.C++为什么要使用extern C ,才能调用c文件的内容?<")]),v._v(" "),p("p",[v._v("5.定义局部数组和直接使用new/malloc分配的内存有什么不一样?")]),v._v(" "),p("p",[v._v("6.栈上面分配数组最大可以分配多少内存?")]),v._v(" "),p("p",[v._v("7.free/delete是如何知道需要释放的内存段有多大?◆")]),v._v(" "),p("p",[v._v("8.空指针和野指针的区别?")]),v._v(" "),p("p",[v._v("9.场景, 2个线程分别有2个指针, p1, p2 ,都指向了同一-片内存,现在释放掉p1 ,内存已经被释放了,但是现在p2也要释放内存, 这个时候会出问题吗?怎么解决? ( 引用计数,互斥锁,无锁cas")]),v._v(" "),p("p",[v._v("10.通常计算字符串长度使用strlen , sizeof能计算字符串的长度吗?")]),v._v(" "),p("p",[v._v("11.算法题,判断一个数是否是2的n次方")]),v._v(" "),p("p",[v._v("12.进程和线程的区别")]),v._v(" "),p("p",[v._v("13.案例题,你需要综合考虑;多核cpu场景,使用多线程的场景去设计数据的手法,数据的计算,整体协调的效率达到最大。简单的当做网络接口的接收和")]),v._v(" "),p("p",[v._v("发送 epoll 线程池 协程")]),v._v(" "),p("p",[v._v("14.tcp和udp的区别")]),v._v(" "),p("p",[v._v("15.socket套接字变成,服务器端都有哪些函数,功能是什么")]),v._v(" "),p("p",[v._v("16.网络编程,网络协议栈有没有了解")]),v._v(" "),p("p",[v._v("17.类似于epoll这样的技术,你是如何学习的?")]),v._v(" "),p("p",[v._v("18.除了c/c+ +平时还接触其他语言吗?")]),v._v(" "),p("p",[v._v("19.go语言有接触过吗?")]),v._v(" "),p("p",[v._v("深信服二面2020年09月16日星期三14:33:02 CST")]),v._v(" "),p("p",[v._v("1.用什么语言来做的这个服务器?")]),v._v(" "),p("p",[v._v("2.(啊?怎么用c/c+ +来做? )并发能有多少?")]),v._v(" "),p("p",[v._v("3.我觉得20w比较悬,能做到20w并发不太可能")]),v._v(" "),p("p",[v._v("4.有没有做断点续传的功能,闪存(秒传)的功能,如何做的?")]),v._v(" "),p("p",[v._v("5.你们是提供给别人sdk吗?")]),v._v(" "),p("p",[v._v("6.如何验证文件的md5值,细节?")]),v._v(" "),p("p",[v._v("7.如果用http chunk编码的方式如何做?")]),v._v(" "),p("p",[v._v("8.全部都用你的客户端上传文件,你没有办法控制文件的格式和安全的?")]),v._v(" "),p("p",[v._v("9.浏览器想去在线打开你的文件,你为什么不支持chunk编码的方式?")]),v._v(" "),p("p",[v._v("10.你理解http的chunk编码吗?")]),v._v(" "),p("p",[v._v("11.鉴权如何做,用户权限是如何做的?")]),v._v(" "),p("p",[v._v("12.上传文件带了哪些验证信息,具体技术实现细节?")]),v._v(" "),p("p",[v._v("13.上传文件,二进制流你也是放在json里面吗?")]),v._v(" "),p("p",[v._v("14.我是黑客的话就不按你的流程走,直接把文件传到你的服务器里面,这个怎么办?")]),v._v(" "),p("p",[v._v("15.token是明文的话,很容易被别人拿到,这个是很不安全的,如何处理?")]),v._v(" "),p("p",[v._v("16.token的做法,文件上传的做法,需要说的更加清楚和细节-一些")]),v._v(" "),p("p",[v._v("17.这样做不行,如果不对上传文件做校验的话,这样做是有问题的,是存在漏洞的")]),v._v(" "),p("p",[v._v("18.http明显有一个auth的字段为什么不用 ,你现在做的这样是不合理的")]),v._v(" "),p("p",[v._v("19.你还有做过其他的一一些项目吗,互联网的")]),v._v(" "),p("p",[v._v("20.有做过linux内核网络层的项目开发吗?")]),v._v(" "),p("p",[v._v("21.网络通信这一块有别的项目经验吗?自己去做的scoket项目有吗?")]),v._v(" "),p("p",[v._v("22.socket阻塞和非阻塞有什么区别?如何写?")]),v._v(" "),p("p",[v._v("23.recv返回-1有哪几种情况要处理?")]),v._v(" "),p("p",[v._v("24.看你还做了linux内核移植的,是做过内核的编程呢还是编译?")]),v._v(" "),p("p",[v._v("25.有把哪一一个开源技术研究的比较深的经历吗,搞的比较透的那种?")]),v._v(" "),p("p",[v._v("26.做的项目过程中,有没有遇到最困难,最难查的bug ,如何解决的?我是要看你解决问题的深度")]),v._v(" "),p("p",[v._v("27.你说的这些都是基本的调试技术,这是必须会的,你有让你印象比较深刻的很难的")]),v._v(" "),p("p",[v._v("28.你看下你那边还有什么项目可以证明你能力的?")]),v._v(" "),p("p",[v._v("29.你在网络这一块相对比较有经验-点对吧,网络编程这一块")]),v._v(" "),p("p",[v._v("30.有兴趣学其他的语言吗?比如go语言, python语言")]),v._v(" "),p("p",[v._v("31.介绍一些你过往比较快学习- 一个技术且掌握的案例吗?")]),v._v(" "),p("p",[v._v("32.有看过哪些书籍?看看你的学识能力")]),v._v(" "),p("p",[v._v("我问的问题")]),v._v(" "),p("p",[v._v("1.这个岗位核心技能是网络相关的技能还是安全的技能")]),v._v(" "),p("p",[v._v("●大部分主要还是网络这一块的,对内核的编程要有一些了解,应用层的编程也是需")]),v._v(" "),p("p",[v._v("●刚才和你说的chunk编码类似的会用到openssl做加密,你对openssI有了解过吗")]),v._v(" "),p("p",[v._v("●要对网络层的各种协议要搞的很熟,例如gre ,例如unix网络编程, tcp/ip详解")])])}),[],!1,null,null,null);_.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/25.3423b9d6.js b/assets/js/25.3423b9d6.js new file mode 100644 index 0000000..809e654 --- /dev/null +++ b/assets/js/25.3423b9d6.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[25],{607:function(e,s,t){"use strict";t.r(s);var a=t(15),r=Object(a.a)({},(function(){var e=this,s=e.$createElement,t=e._self._c||s;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("p",[t("img",{attrs:{src:"https://img.shields.io/badge/vuepress-0.14.8-brightgreen.svg",alt:"vuepress"}}),e._v(" "),t("img",{attrs:{src:"https://img.shields.io/badge/leancloud--storage-3.10.1-orange.svg",alt:"leancloud-storage"}}),e._v(" "),t("img",{attrs:{src:"https://img.shields.io/badge/valine-1.3.4-blue.svg",alt:"valine"}})]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"title"},[e._v("介绍")]),t("ol",[t("li",[e._v("这是一个vuepress主题,旨在添加博客所需的分类、TAB墙、分页、评论等能;"),t("br")]),e._v(" "),t("li",[e._v("主题追求极简,根据 vuepress 的默认主题修改而成,官方的主题配置仍然适用;"),t("br")]),e._v(" "),t("li",[e._v("你可以打开 "),t("a",{attrs:{href:"http://recoluan.gitlab.io",target:"_blank",rel:"noopener noreferrer"}},[e._v("午后南杂"),t("OutboundLink")],1),e._v(" 来查看效果。")])])]),t("h2",{attrs:{id:"use"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#use"}},[e._v("#")]),e._v(" Use")]),e._v(" "),t("p",[t("strong",[e._v("Build")])]),e._v(" "),t("div",{staticClass:"language-bash line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("npm")]),e._v(" run build\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# or")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("yarn")]),e._v(" build\n")])]),e._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[e._v("1")]),t("br"),t("span",{staticClass:"line-number"},[e._v("2")]),t("br"),t("span",{staticClass:"line-number"},[e._v("3")]),t("br"),t("span",{staticClass:"line-number"},[e._v("4")]),t("br"),t("span",{staticClass:"line-number"},[e._v("5")]),t("br")])]),t("p",[t("strong",[e._v("Server")])]),e._v(" "),t("div",{staticClass:"language-bash line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("npm")]),e._v(" run dev\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# or")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("yarn")]),e._v(" dev\n")])]),e._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[e._v("1")]),t("br"),t("span",{staticClass:"line-number"},[e._v("2")]),t("br"),t("span",{staticClass:"line-number"},[e._v("3")]),t("br"),t("span",{staticClass:"line-number"},[e._v("4")]),t("br"),t("span",{staticClass:"line-number"},[e._v("5")]),t("br")])]),t("h2",{attrs:{id:"play-together"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#play-together"}},[e._v("#")]),e._v(" Play Together")]),e._v(" "),t("h3",{attrs:{id:"_0-x"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_0-x"}},[e._v("#")]),e._v(" 0.x")]),e._v(" "),t("p",[t("code",[e._v("vuepress-theme-reco@0.x")]),e._v(" 是基于 "),t("code",[e._v("vuepress@0.x")]),e._v(" 的博客主题。")]),e._v(" "),t("p",[t("code",[e._v("vuepress@0.x")]),e._v(" 功能比较简单,只适合书写简单的文档,但好在支持主题自定义,而个人又希望能够用它来书写博客,原因就是它足够的简洁,毫无疑问,这也符合很多程序员的观念,也就是在这种情况下,"),t("code",[e._v("vuepress-theme-reco@0.x")]),e._v(" 的第一个版本经过一个通宵而产生。")]),e._v(" "),t("p",[e._v("主题开源不久,很多朋友通过各种联系方式,给到很多好的意见和建议,所以我个人也在积极地更新。")]),e._v(" "),t("p",[e._v("因为我是一名前端开发工程师,开发的过程中,总是想着能不能加入一些炫酷的效果,有很多次都是添加上又去掉,反反复复,最后都是被 "),t("strong",[e._v("简洁")]),e._v(" 的这个原则阻止掉,毕竟,现在我是将它当作一个产品来看待,并不是一个技术或者是技巧的尝试项目。")]),e._v(" "),t("h3",{attrs:{id:"_1-x"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_1-x"}},[e._v("#")]),e._v(" 1.x")]),e._v(" "),t("p",[e._v("随着不断有用户过来询问:为什么 "),t("code",[e._v("vuepress-theme-reco@0.x")]),e._v(" 不能在 "),t("code",[e._v("vuepress@1.x")]),e._v(" 上使用?本来只是打算对 "),t("code",[e._v("vuepress-theme-reco@0.x")]),e._v(" 进行简单的bug修复的我,终究还是忍不住,开始了 "),t("code",[e._v("vuepress-theme-reco@1.x")]),e._v(" 的开发。又是在一个寂静的凌晨两点半(晚上就是出活快),我默默地开始了。")]),e._v(" "),t("p",[e._v("主题升级的关键也就是 "),t("code",[e._v("@vuepress/plugin-blog")]),e._v(" 这款官方插件,它不需要再去麻烦地过滤数据,将分类和标签的相关信息直接存在 "),t("code",[e._v("$categories")]),e._v(" 和 "),t("code",[e._v("$tags")]),e._v(" 这两个全局变量中。借助于 "),t("code",[e._v("@vuepress/plugin-blog")]),e._v(",分类和标签功能更容易实现,但也有了一些局限。接下来两三天的时间,都是在进行功能的迁移和一些bug的修复。")]),e._v(" "),t("p",[t("code",[e._v("vuepress-theme-reco@0.x")]),e._v(" 的开发中,更加深刻地明白了模块化和组件化编程的重要性,如果当初没有把一些功能进行封装,而是直接简单的复制,这次升级也不会这么顺利。模块拆分的越细,使用就会越灵活。")]),e._v(" "),t("h3",{attrs:{id:"cli"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#cli"}},[e._v("#")]),e._v(" CLI")]),e._v(" "),t("p",[e._v("还是衷心地希望能有更多的朋友参与进来,更快地去完善它。接下来时间允许的情况下,我会开源一款自动生成博客的脚手架,略过配置步骤,直接书写优质内容,这也是我后来逐渐形成的一种信念,就是希望能让这款主题,功能越完善,使用越来越简单。")]),e._v(" "),t("h2",{attrs:{id:"license"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#license"}},[e._v("#")]),e._v(" License")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/recoluan/vuepress-theme-reco/blob/master/LICENSE",target:"_blank",rel:"noopener noreferrer"}},[e._v("MIT"),t("OutboundLink")],1)])])}),[],!1,null,null,null);s.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/26.14b116b2.js b/assets/js/26.14b116b2.js new file mode 100644 index 0000000..7e8f099 --- /dev/null +++ b/assets/js/26.14b116b2.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[26],{608:function(_,v,t){"use strict";t.r(v);var r=t(15),a=Object(r.a)({},(function(){var _=this,v=_.$createElement,t=_._self._c||v;return t("ContentSlotsDistributor",{attrs:{"slot-key":_.$parent.slotKey}},[t("h1",{attrs:{id:"一级标题"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#一级标题"}},[_._v("#")]),_._v(" 一级标题")]),_._v(" "),t("h2",{attrs:{id:"二级标题"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#二级标题"}},[_._v("#")]),_._v(" 二级标题")]),_._v(" "),t("h3",{attrs:{id:"三级标题"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#三级标题"}},[_._v("#")]),_._v(" 三级标题")]),_._v(" "),t("h4",{attrs:{id:"四级标题"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#四级标题"}},[_._v("#")]),_._v(" 四级标题")]),_._v(" "),t("h5",{attrs:{id:"五级标题"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#五级标题"}},[_._v("#")]),_._v(" 五级标题")]),_._v(" "),t("h6",{attrs:{id:"六级标题"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#六级标题"}},[_._v("#")]),_._v(" 六级标题")]),_._v(" "),t("p",[t("em",[_._v("斜体文字")])]),_._v(" "),t("p",[t("em",[_._v("斜体文字")])]),_._v(" "),t("p",[t("strong",[_._v("粗体文字")])]),_._v(" "),t("p",[t("strong",[_._v("粗体文字")])]),_._v(" "),t("p",[t("em",[t("strong",[_._v("粗斜体文字")])])]),_._v(" "),t("p",[t("em",[t("strong",[_._v("粗斜体文字")])])]),_._v(" "),t("p",[_._v("分割线")]),_._v(" "),t("hr"),_._v(" "),t("hr"),_._v(" "),t("hr"),_._v(" "),t("hr"),_._v(" "),t("hr"),_._v(" "),t("p",[_._v("删除线")]),_._v(" "),t("p",[_._v("baidu.com\nsina.com\n"),t("s",[_._v("tencent.com")])]),_._v(" "),t("p",[t("u",[_._v("带下划线文本")])]),_._v(" "),t("p",[_._v("[^要注明的文本]:")]),_._v(" "),t("ul",[t("li",[_._v("第一项")]),_._v(" "),t("li",[_._v("第二项")]),_._v(" "),t("li",[_._v("第三项")])]),_._v(" "),t("ul",[t("li",[_._v("第一项")]),_._v(" "),t("li",[_._v("第二项")]),_._v(" "),t("li",[_._v("第三项")])]),_._v(" "),t("ul",[t("li",[_._v("第一项")]),_._v(" "),t("li",[_._v("第二项")]),_._v(" "),t("li",[_._v("第三项")])]),_._v(" "),t("ol",[t("li",[_._v("第一项:\n"),t("ul",[t("li",[_._v("第一项嵌套的第一个元素")]),_._v(" "),t("li",[_._v("第一项嵌套的第二个元素")])])]),_._v(" "),t("li",[_._v("第二项:\n"),t("ul",[t("li",[_._v("第二项嵌套的第一个元素")]),_._v(" "),t("li",[_._v("第二项嵌套的第二个元素")])])])]),_._v(" "),t("blockquote",[t("p",[_._v("最外层")]),_._v(" "),t("blockquote",[t("p",[_._v("第一层嵌套")]),_._v(" "),t("blockquote",[t("p",[_._v("第二层嵌套")])])])]),_._v(" "),t("p",[_._v("'print()' 函数")]),_._v(" "),t("p",[_._v("代码区块")]),_._v(" "),t("p",[_._v("'''javascript\n$(document).read(function(){\nalert('Markdown');\n});\n'''")]),_._v(" "),t("p",[t("a",{attrs:{href:"%E9%93%BE%E6%8E%A5%E5%9C%B0%E5%9D%80"}},[_._v("链接名称")]),_._v("\n或者\n<链接地址>")]),_._v(" "),t("p",[_._v("这是一个链接 "),t("a",{attrs:{href:"https://news.sina.com.cn/",target:"_blank",rel:"noopener noreferrer"}},[_._v("新浪新闻"),t("OutboundLink")],1),_._v(" "),t("a",{attrs:{href:"https://news.sina.com.cn/",target:"_blank",rel:"noopener noreferrer"}},[_._v("https://news.sina.com.cn/"),t("OutboundLink")],1)]),_._v(" "),t("p",[t("img",{attrs:{src:"https://pic4.zhimg.com/80/v2-a47051e92cf74930bedd7469978e6c08_hd.png",alt:"有问题上知乎 图标"}})]),_._v(" "),t("table",[t("thead",[t("tr",[t("th",[_._v("表头1")]),_._v(" "),t("th",[_._v("表头2")])])]),_._v(" "),t("tbody",[t("tr",[t("td",[_._v("单元格11")]),_._v(" "),t("td",[_._v("单元格12")])]),_._v(" "),t("tr",[t("td",[_._v("单元格21")]),_._v(" "),t("td",[_._v("单元格22")])])])]),_._v(" "),t("p",[_._v("使用"),t("kbd",[_._v("Ctrl")]),_._v("+"),t("kbd",[_._v("Alt")]),_._v("+"),t("kbd",[_._v("Del")]),_._v("重启电脑")]),_._v(" "),t("p",[t("strong",[_._v("文本加粗")]),_._v("\n**正常显示星号**")]),_._v(" "),t("p",[_._v("$$\n\\int_0^1 {x^2} ,{\\rm d}x\n$$")])])}),[],!1,null,null,null);v.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/27.946e74f9.js b/assets/js/27.946e74f9.js new file mode 100644 index 0000000..a56c0c7 --- /dev/null +++ b/assets/js/27.946e74f9.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[27],{609:function(t,e,n){"use strict";n.r(e);var s=n(15),i=Object(s.a)({},(function(){var t=this.$createElement,e=this._self._c||t;return e("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[e("p",[this._v("second page in redis")])])}),[],!1,null,null,null);e.default=i.exports}}]); \ No newline at end of file diff --git a/assets/js/28.33fa0677.js b/assets/js/28.33fa0677.js new file mode 100644 index 0000000..05b5e08 --- /dev/null +++ b/assets/js/28.33fa0677.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[28],{610:function(t,e,n){"use strict";n.r(e);var s=n(15),l=Object(s.a)({},(function(){var t=this.$createElement,e=this._self._c||t;return e("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[e("p",[this._v("1111111")])])}),[],!1,null,null,null);e.default=l.exports}}]); \ No newline at end of file diff --git a/assets/js/29.6f72c1d3.js b/assets/js/29.6f72c1d3.js new file mode 100644 index 0000000..3a2744b --- /dev/null +++ b/assets/js/29.6f72c1d3.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[29],{611:function(t,e,n){"use strict";n.r(e);var s=n(15),i=Object(s.a)({},(function(){var t=this.$createElement,e=this._self._c||t;return e("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[e("p",[this._v("first page in zmq")])])}),[],!1,null,null,null);e.default=i.exports}}]); \ No newline at end of file diff --git a/assets/js/3.5a4097ad.js b/assets/js/3.5a4097ad.js new file mode 100644 index 0000000..8e15d9c --- /dev/null +++ b/assets/js/3.5a4097ad.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[3],{493:function(t,e,a){},494:function(t,e,a){},495:function(t,e,a){},498:function(t,e,a){},499:function(t,e,a){"use strict";a(91);var n=a(159),r=a(491),o=a(490),s=Object(n.b)({components:{RecoIcon:r.b},props:{pageInfo:{type:Object,default:function(){return{}}},currentTag:{type:String,default:""},showAccessNumber:{type:Boolean,default:!1}},setup:function(t,e){var a=Object(o.a)();return{numStyle:{fontSize:".9rem",fontWeight:"normal",color:"#999"},goTags:function(t){a.$route.path!=="/tag/".concat(t,"/")&&a.$router.push({path:"/tag/".concat(t,"/")})},formatDateValue:function(t){return new Intl.DateTimeFormat(a.$lang).format(new Date(t))}}}}),i=(a(500),a(15)),c=Object(i.a)(s,(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",[t.pageInfo.frontmatter.author||t.$themeConfig.author?a("reco-icon",{attrs:{icon:"reco-account"}},[a("span",[t._v(t._s(t.pageInfo.frontmatter.author||t.$themeConfig.author))])]):t._e(),t._v(" "),t.pageInfo.frontmatter.date?a("reco-icon",{attrs:{icon:"reco-date"}},[a("span",[t._v(t._s(t.formatDateValue(t.pageInfo.frontmatter.date)))])]):t._e(),t._v(" "),!0===t.showAccessNumber?a("reco-icon",{attrs:{icon:"reco-eye"}},[a("AccessNumber",{attrs:{idVal:t.pageInfo.path,numStyle:t.numStyle}})],1):t._e(),t._v(" "),t.pageInfo.frontmatter.tags?a("reco-icon",{staticClass:"tags",attrs:{icon:"reco-tag"}},t._l(t.pageInfo.frontmatter.tags,(function(e,n){return a("span",{key:n,staticClass:"tag-item",class:{active:t.currentTag==e},on:{click:function(a){return a.stopPropagation(),t.goTags(e)}}},[t._v(t._s(e))])})),0):t._e()],1)}),[],!1,null,"f875f3fc",null);e.a=c.exports},500:function(t,e,a){"use strict";a(493)},501:function(t,e,a){"use strict";a(494)},502:function(t,e,a){"use strict";a(495)},503:function(t,e,a){"use strict";a(43);var n=a(159),r=(a(161),a(264),{methods:{_getStoragePage:function(){var t=window.location.pathname,e=JSON.parse(sessionStorage.getItem("currentPage"));return null===e||t!==e.path?(sessionStorage.setItem("currentPage",JSON.stringify({page:1,path:""})),1):parseInt(e.page)},_setStoragePage:function(t){var e=window.location.pathname;sessionStorage.setItem("currentPage",JSON.stringify({page:t,path:e}))}}}),o=a(491),s=a(499),i=Object(n.b)({components:{PageInfo:s.a,RecoIcon:o.b},props:["item","currentPage","currentTag"]}),c=(a(501),a(15)),l=Object(c.a)(i,(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"abstract-item",on:{click:function(e){return t.$router.push(t.item.path)}}},[t.item.frontmatter.sticky?a("reco-icon",{attrs:{icon:"reco-sticky"}}):t._e(),t._v(" "),a("div",{staticClass:"title"},[t.item.frontmatter.keys?a("reco-icon",{attrs:{icon:"reco-lock"}}):t._e(),t._v(" "),a("router-link",{attrs:{to:t.item.path}},[t._v(t._s(t.item.title))])],1),t._v(" "),a("div",{staticClass:"abstract",domProps:{innerHTML:t._s(t.item.excerpt)}}),t._v(" "),a("PageInfo",{attrs:{pageInfo:t.item,currentTag:t.currentTag}})],1)}),[],!1,null,"ff2c8be0",null).exports,u=a(490),p=Object(n.b)({mixins:[r],components:{NoteAbstractItem:l},props:["data","currentTag"],setup:function(t,e){var a=Object(u.a)(),r=Object(n.h)(t).data,o=Object(n.g)(1),s=Object(n.a)((function(){var t=(o.value-1)*a.$perPage,e=o.value*a.$perPage;return r.value.slice(t,e)}));return Object(n.d)((function(){o.value=a._getStoragePage()||1})),{currentPage:o,currentPageData:s,getCurrentPage:function(t){o.value=t,a._setStoragePage(t),e.emit("paginationChange",t)}}},watch:{$route:function(){this.currentPage=this._getStoragePage()||1}}}),f=(a(502),Object(c.a)(p,(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"abstract-wrapper"},[t._l(t.currentPageData,(function(e){return a("NoteAbstractItem",{key:e.path,attrs:{item:e,currentPage:t.currentPage,currentTag:t.currentTag}})})),t._v(" "),a("pagation",{staticClass:"pagation",attrs:{total:t.data.length,currentPage:t.currentPage},on:{getCurrentPage:t.getCurrentPage}})],2)}),[],!1,null,"6cc0658a",null));e.a=f.exports},506:function(t,e,a){"use strict";a(498)},508:function(t,e,a){"use strict";var n=a(66),r=(a(160),a(159)),o=a(120),s=a(490),i=Object(r.b)({props:{currentTag:{type:String,default:""}},setup:function(t,e){var a=Object(s.a)();return{tags:Object(r.a)((function(){return[{name:a.$recoLocales.all,path:"/tag/"}].concat(Object(n.a)(a.$tagesList))})),tagClick:function(t){e.emit("getCurrentTag",t)},getOneColor:o.b}}}),c=(a(506),a(15)),l=Object(c.a)(i,(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"tags"},t._l(t.tags,(function(e,n){return a("span",{directives:[{name:"show",rawName:"v-show",value:!e.pages||e.pages&&e.pages.length>0,expression:"!item.pages || (item.pages && item.pages.length > 0)"}],key:n,class:{active:e.name==t.currentTag},style:{backgroundColor:t.getOneColor()},on:{click:function(a){return t.tagClick(e)}}},[t._v(t._s(e.name))])})),0)}),[],!1,null,"285c9a44",null);e.a=l.exports},530:function(t,e,a){},531:function(t,e,a){},532:function(t,e,a){},533:function(t,e,a){},534:function(t,e,a){},535:function(t,e,a){},536:function(t,e,a){},537:function(t,e,a){},572:function(t,e,a){"use strict";a(530)},573:function(t,e,a){"use strict";a(531)},574:function(t,e,a){t.exports=a.p+"assets/img/bg.2cfdbb33.svg"},575:function(t,e,a){"use strict";a(532)},576:function(t,e,a){"use strict";a(533)},577:function(t,e,a){"use strict";a(534)},578:function(t){t.exports=JSON.parse('{"a":"1.6.10"}')},579:function(t,e,a){"use strict";a(535)},580:function(t,e,a){"use strict";a(536)},581:function(t,e,a){"use strict";a(537)},586:function(t,e,a){"use strict";a.r(e);var n=a(159),r=a(510),o=a(491),s=a(490),i=Object(n.b)({components:{NavLink:r.a,ModuleTransition:o.a},setup:function(t,e){var a=Object(s.a)();return{recoShowModule:Object(n.a)((function(){return a&&a.$parent.recoShowModule})),actionLink:Object(n.a)((function(){return a&&{link:a.$frontmatter.actionLink,text:a.$frontmatter.actionText}})),heroImageStyle:Object(n.a)((function(){return a.$frontmatter.heroImageStyle||{maxHeight:"200px",margin:"6rem auto 1.5rem"}}))}}}),c=(a(572),a(15)),l=Object(c.a)(i,(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"home"},[a("div",{staticClass:"hero"},[a("ModuleTransition",[t.recoShowModule&&t.$frontmatter.heroImage?a("img",{style:t.heroImageStyle||{},attrs:{src:t.$withBase(t.$frontmatter.heroImage),alt:"hero"}}):t._e()]),t._v(" "),a("ModuleTransition",{attrs:{delay:"0.04"}},[t.recoShowModule&&null!==t.$frontmatter.heroText?a("h1",{style:{marginTop:t.$frontmatter.heroImage?"0px":"140px"}},[t._v("\n "+t._s(t.$frontmatter.heroText||t.$title||"vuePress-theme-reco")+"\n ")]):t._e()]),t._v(" "),a("ModuleTransition",{attrs:{delay:"0.08"}},[t.recoShowModule&&null!==t.$frontmatter.tagline?a("p",{staticClass:"description"},[t._v("\n "+t._s(t.$frontmatter.tagline||t.$description||"Welcome to your vuePress-theme-reco site")+"\n ")]):t._e()]),t._v(" "),a("ModuleTransition",{attrs:{delay:"0.16"}},[t.recoShowModule&&t.$frontmatter.actionText&&t.$frontmatter.actionLink?a("p",{staticClass:"action"},[a("NavLink",{staticClass:"action-button",attrs:{item:t.actionLink}})],1):t._e()])],1),t._v(" "),a("ModuleTransition",{attrs:{delay:"0.24"}},[t.recoShowModule&&t.$frontmatter.features&&t.$frontmatter.features.length?a("div",{staticClass:"features"},t._l(t.$frontmatter.features,(function(e,n){return a("div",{key:n,staticClass:"feature"},[a("h2",[t._v(t._s(e.title))]),t._v(" "),a("p",[t._v(t._s(e.details))])])})),0):t._e()]),t._v(" "),a("ModuleTransition",{attrs:{delay:"0.32"}},[a("Content",{directives:[{name:"show",rawName:"v-show",value:t.recoShowModule,expression:"recoShowModule"}],staticClass:"home-center",attrs:{custom:""}})],1)],1)}),[],!1,null,null,null).exports,u=a(17),p=(a(90),a(508)),f=(a(27),a(63),a(49),a(525)),g=a.n(f),d=a(120),m=function(){var t=Object(s.a)(),e=Object(n.g)(!0),a=Object(n.f)({left:0,top:0});return Object(n.d)((function(){e.value=!/Android|webOS|iPhone|iPod|BlackBerry/i.test(navigator.userAgent)})),{popupWindowStyle:a,showDetail:function(n){var r=n.target;r.querySelector(".popup-window-wrapper").style.display="block";var o=r.querySelector(".popup-window"),s=document.querySelector(".info-wrapper"),i=r.clientWidth,c=o.clientWidth,l=o.clientHeight;if(e)a.left=(i-c)/2+"px",a.top=-l+"px",s.style.overflow="visible",t.$nextTick((function(){!function(t){var e=document.body.offsetWidth,n=t.getBoundingClientRect(),r=e-(n.x+n.width);if(r<0){var o=t.offsetLeft;a.left=o+r+"px"}}(o)}));else{var u=function(t){var e=document,a=t.getBoundingClientRect(),n=a.left,r=a.top;return{left:n+=e.documentElement.scrollLeft||e.body.scrollLeft,top:r+=e.documentElement.scrollTop||e.body.scrollTop}};s.style.overflow="hidden";var p=u(r).left-u(s).left;a.left=-p+(s.clientWidth-o.clientWidth)/2+"px",a.top=-l+"px"}},hideDetail:function(t){t.target.querySelector(".popup-window-wrapper").style.display="none"}}},h=Object(n.b)({setup:function(t,e){var a=Object(s.a)(),r=m(),o=r.popupWindowStyle,i=r.showDetail,c=r.hideDetail;return{dataAddColor:Object(n.a)((function(){var t=(a&&a.$themeConfig).friendLink;return(void 0===t?[]:t).map((function(t){return t.color=Object(d.b)(),t}))})),popupWindowStyle:o,showDetail:i,hideDetail:c,getImgUrl:function(t){var e=t.logo,n=void 0===e?"":e,r=t.email,o=void 0===r?"":r;return n&&/^http/.test(n)?n:n&&!/^http/.test(n)?a.$withBase(n):"//1.gravatar.com/avatar/".concat(g()(o||""),"?s=50&d=mm&r=x")}}}}),v=(a(573),Object(c.a)(h,(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"friend-link-wrapper"},t._l(t.dataAddColor,(function(e,n){return a("div",{key:n,staticClass:"friend-link-item",attrs:{target:"_blank"},on:{mouseenter:function(e){return t.showDetail(e)},mouseleave:function(e){return t.hideDetail(e)}}},[a("span",{staticClass:"list-style",style:{backgroundColor:e.color}}),t._v("\n "+t._s(e.title)+"\n "),a("transition",{attrs:{name:"fade"}},[a("div",{staticClass:"popup-window-wrapper"},[a("div",{ref:"popupWindow",refInFor:!0,staticClass:"popup-window",style:t.popupWindowStyle},[a("div",{staticClass:"logo"},[a("img",{attrs:{src:t.getImgUrl(e)}})]),t._v(" "),a("div",{staticClass:"info"},[a("div",{staticClass:"title"},[a("h4",[t._v(t._s(e.title))]),t._v(" "),a("a",{staticClass:"btn-go",style:{backgroundColor:e.color},attrs:{href:e.link,target:"_blank"}},[t._v("GO")])]),t._v(" "),e.desc?a("p",[t._v(t._s(e.desc))]):t._e()])])])])],1)})),0)}),[],!1,null,"165dc218",null).exports),_=a(503),b=a(543),C=Object(n.b)({components:{NoteAbstract:_.a,TagList:p.a,FriendLink:v,ModuleTransition:o.a,PersonalInfo:b.a,RecoIcon:o.b},setup:function(t,e){var r=Object(s.a)(),o=Object(n.f)({recoShow:!1,heroHeight:0}),i=Object(n.a)((function(){return r&&r.$parent.recoShowModule})),c=Object(n.a)((function(){return r.$frontmatter.heroImageStyle||{}})),l=Object(n.a)((function(){var t=r.$frontmatter.bgImage?r.$withBase(r.$frontmatter.bgImage):a(574),e={textAlign:"center",overflow:"hidden",background:"url(".concat(t,") center/cover no-repeat")},n=r.$frontmatter.bgImageStyle;return n?Object(u.a)(Object(u.a)({},e),n):e}));return Object(n.d)((function(){o.heroHeight=document.querySelector(".hero").clientHeight,o.recoShow=!0})),Object(u.a)(Object(u.a)({recoShowModule:i,heroImageStyle:c,bgImageStyle:l},Object(n.h)(o)),{},{getOneColor:d.b})},methods:{paginationChange:function(t){var e=this;setTimeout((function(){window.scrollTo(0,e.heroHeight)}),100)},getPagesByTags:function(t){this.$router.push({path:t.path})}}}),w=(a(575),Object(c.a)(C,(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"home-blog"},[a("div",{staticClass:"hero",style:Object.assign({},t.bgImageStyle)},[a("div",[a("ModuleTransition",[t.recoShowModule&&t.$frontmatter.heroImage?a("img",{staticClass:"hero-img",style:t.heroImageStyle||{},attrs:{src:t.$withBase(t.$frontmatter.heroImage),alt:"hero"}}):t._e()]),t._v(" "),a("ModuleTransition",{attrs:{delay:"0.04"}},[t.recoShowModule&&null!==t.$frontmatter.heroText?a("h1",[t._v("\n "+t._s(t.$frontmatter.heroText||t.$title||"vuePress-theme-reco")+"\n ")]):t._e()]),t._v(" "),a("ModuleTransition",{attrs:{delay:"0.08"}},[t.recoShowModule&&null!==t.$frontmatter.tagline?a("p",{staticClass:"description"},[t._v("\n "+t._s(t.$frontmatter.tagline||t.$description||"Welcome to your vuePress-theme-reco site")+"\n ")]):t._e()])],1)]),t._v(" "),a("ModuleTransition",{attrs:{delay:"0.16"}},[a("div",{directives:[{name:"show",rawName:"v-show",value:t.recoShowModule,expression:"recoShowModule"}],staticClass:"home-blog-wrapper"},[a("div",{staticClass:"blog-list"},[a("note-abstract",{attrs:{data:t.$recoPosts},on:{paginationChange:t.paginationChange}})],1),t._v(" "),a("div",{staticClass:"info-wrapper"},[a("PersonalInfo"),t._v(" "),a("h4",[a("reco-icon",{attrs:{icon:"reco-category"}}),t._v(" "+t._s(t.$recoLocales.category))],1),t._v(" "),a("ul",{staticClass:"category-wrapper"},t._l(this.$categories.list,(function(e,n){return a("li",{key:n,staticClass:"category-item"},[a("router-link",{attrs:{to:e.path}},[a("span",{staticClass:"category-name"},[t._v(t._s(e.name))]),t._v(" "),a("span",{staticClass:"post-num",style:{backgroundColor:t.getOneColor()}},[t._v(t._s(e.pages.length))])])],1)})),0),t._v(" "),a("hr"),t._v(" "),0!==t.$tags.list.length?a("h4",[a("reco-icon",{attrs:{icon:"reco-tag"}}),t._v(" "+t._s(t.$recoLocales.tag))],1):t._e(),t._v(" "),a("TagList",{on:{getCurrentTag:t.getPagesByTags}}),t._v(" "),t.$themeConfig.friendLink&&0!==t.$themeConfig.friendLink.length?a("h4",[a("reco-icon",{attrs:{icon:"reco-friend"}}),t._v(" "+t._s(t.$recoLocales.friendLink))],1):t._e(),t._v(" "),a("FriendLink")],1)])]),t._v(" "),a("ModuleTransition",{attrs:{delay:"0.24"}},[a("Content",{directives:[{name:"show",rawName:"v-show",value:t.recoShowModule,expression:"recoShowModule"}],staticClass:"home-center",attrs:{custom:""}})],1)],1)}),[],!1,null,null,null).exports),$=(a(64),a(499)),y=a(50),O=a(88),S=a(66),j=(a(160),Object(n.b)({setup:function(t,e){var a=Object(s.a)();return{headers:Object(n.a)((function(){return a.$showSubSideBar?a.$page.headers:[]})),isLinkActive:function(t){var e=Object(y.e)(a.$route,a.$page.path+"#"+t.slug);return e&&setTimeout((function(){document.querySelector(".reco-side-".concat(t.slug)).scrollIntoView()}),300),e}}},render:function(t){var e=this;return t("ul",{class:{"sub-sidebar-wrapper":!0},style:{width:this.headers.length>0?"12rem":"0"}},Object(S.a)(this.headers.map((function(a){return t("li",{class:Object(O.a)({active:e.isLinkActive(a)},"level-".concat(a.level),!0),attr:{key:a.title}},[t("router-link",{class:Object(O.a)({"sidebar-link":!0},"reco-side-".concat(a.slug),!0),props:{to:"".concat(e.$page.path,"#").concat(a.slug)}},a.title)])}))))}})),k=(a(576),Object(c.a)(j,void 0,void 0,!1,null,"cb1513f6",null).exports);function T(t,e,a){var n=[];!function t(e,a){for(var n=0,r=e.length;n0,expression:"!item.pages || (item.pages && item.pages.length > 0)"}],key:n,class:{active:e.name==t.currentTag},style:{backgroundColor:t.getOneColor()},on:{click:function(a){return t.tagClick(e)}}},[t._v(t._s(e.name))])})),0)}),[],!1,null,"285c9a44",null);e.a=u.exports},538:function(t,e,a){},582:function(t,e,a){"use strict";a(538)},589:function(t,e,a){"use strict";a.r(e);a(90);var n=a(159),r=a(507),o=a(503),c=a(508),s=a(491),i=a(87),u=a(504),g=a(490),l=Object(n.b)({mixins:[u.a],components:{Common:r.a,NoteAbstract:o.a,TagList:c.a,ModuleTransition:s.a},setup:function(t,e){var a=Object(g.a)();return{posts:Object(n.a)((function(){var t=a.$currentTags.pages;return t=Object(i.a)(t),Object(i.c)(t),t})),getCurrentTag:function(t){e.emit("currentTag",t)},tagClick:function(t){a.$route.path!==t.path&&a.$router.push({path:t.path})},paginationChange:function(t){setTimeout((function(){window.scrollTo(0,0)}),100)}}}}),p=(a(496),a(505),a(582),a(15)),f=Object(p.a)(l,(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("Common",{staticClass:"tag-wrapper",attrs:{sidebar:!1}},[a("ModuleTransition",[a("TagList",{directives:[{name:"show",rawName:"v-show",value:t.recoShowModule,expression:"recoShowModule"}],staticClass:"tags",attrs:{currentTag:t.$currentTags.key},on:{getCurrentTag:t.tagClick}})],1),t._v(" "),a("ModuleTransition",{attrs:{delay:"0.08"}},[a("note-abstract",{directives:[{name:"show",rawName:"v-show",value:t.recoShowModule,expression:"recoShowModule"}],staticClass:"list",attrs:{data:t.posts,currentTag:t.$currentTags.key},on:{paginationChange:t.paginationChange}})],1)],1)}),[],!1,null,"25a0fadc",null);e.default=f.exports}}]); \ No newline at end of file diff --git a/assets/js/5.eb8174c0.js b/assets/js/5.eb8174c0.js new file mode 100644 index 0000000..ba275b3 --- /dev/null +++ b/assets/js/5.eb8174c0.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[5],{492:function(t,e,a){},493:function(t,e,a){},494:function(t,e,a){},495:function(t,e,a){},496:function(t,e,a){"use strict";a(492)},497:function(t,e,a){},498:function(t,e,a){},499:function(t,e,a){"use strict";a(91);var n=a(159),r=a(491),o=a(490),c=Object(n.b)({components:{RecoIcon:r.b},props:{pageInfo:{type:Object,default:function(){return{}}},currentTag:{type:String,default:""},showAccessNumber:{type:Boolean,default:!1}},setup:function(t,e){var a=Object(o.a)();return{numStyle:{fontSize:".9rem",fontWeight:"normal",color:"#999"},goTags:function(t){a.$route.path!=="/tag/".concat(t,"/")&&a.$router.push({path:"/tag/".concat(t,"/")})},formatDateValue:function(t){return new Intl.DateTimeFormat(a.$lang).format(new Date(t))}}}}),s=(a(500),a(15)),i=Object(s.a)(c,(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",[t.pageInfo.frontmatter.author||t.$themeConfig.author?a("reco-icon",{attrs:{icon:"reco-account"}},[a("span",[t._v(t._s(t.pageInfo.frontmatter.author||t.$themeConfig.author))])]):t._e(),t._v(" "),t.pageInfo.frontmatter.date?a("reco-icon",{attrs:{icon:"reco-date"}},[a("span",[t._v(t._s(t.formatDateValue(t.pageInfo.frontmatter.date)))])]):t._e(),t._v(" "),!0===t.showAccessNumber?a("reco-icon",{attrs:{icon:"reco-eye"}},[a("AccessNumber",{attrs:{idVal:t.pageInfo.path,numStyle:t.numStyle}})],1):t._e(),t._v(" "),t.pageInfo.frontmatter.tags?a("reco-icon",{staticClass:"tags",attrs:{icon:"reco-tag"}},t._l(t.pageInfo.frontmatter.tags,(function(e,n){return a("span",{key:n,staticClass:"tag-item",class:{active:t.currentTag==e},on:{click:function(a){return a.stopPropagation(),t.goTags(e)}}},[t._v(t._s(e))])})),0):t._e()],1)}),[],!1,null,"f875f3fc",null);e.a=i.exports},500:function(t,e,a){"use strict";a(493)},501:function(t,e,a){"use strict";a(494)},502:function(t,e,a){"use strict";a(495)},503:function(t,e,a){"use strict";a(43);var n=a(159),r=(a(161),a(264),{methods:{_getStoragePage:function(){var t=window.location.pathname,e=JSON.parse(sessionStorage.getItem("currentPage"));return null===e||t!==e.path?(sessionStorage.setItem("currentPage",JSON.stringify({page:1,path:""})),1):parseInt(e.page)},_setStoragePage:function(t){var e=window.location.pathname;sessionStorage.setItem("currentPage",JSON.stringify({page:t,path:e}))}}}),o=a(491),c=a(499),s=Object(n.b)({components:{PageInfo:c.a,RecoIcon:o.b},props:["item","currentPage","currentTag"]}),i=(a(501),a(15)),u=Object(i.a)(s,(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"abstract-item",on:{click:function(e){return t.$router.push(t.item.path)}}},[t.item.frontmatter.sticky?a("reco-icon",{attrs:{icon:"reco-sticky"}}):t._e(),t._v(" "),a("div",{staticClass:"title"},[t.item.frontmatter.keys?a("reco-icon",{attrs:{icon:"reco-lock"}}):t._e(),t._v(" "),a("router-link",{attrs:{to:t.item.path}},[t._v(t._s(t.item.title))])],1),t._v(" "),a("div",{staticClass:"abstract",domProps:{innerHTML:t._s(t.item.excerpt)}}),t._v(" "),a("PageInfo",{attrs:{pageInfo:t.item,currentTag:t.currentTag}})],1)}),[],!1,null,"ff2c8be0",null).exports,g=a(490),l=Object(n.b)({mixins:[r],components:{NoteAbstractItem:u},props:["data","currentTag"],setup:function(t,e){var a=Object(g.a)(),r=Object(n.h)(t).data,o=Object(n.g)(1),c=Object(n.a)((function(){var t=(o.value-1)*a.$perPage,e=o.value*a.$perPage;return r.value.slice(t,e)}));return Object(n.d)((function(){o.value=a._getStoragePage()||1})),{currentPage:o,currentPageData:c,getCurrentPage:function(t){o.value=t,a._setStoragePage(t),e.emit("paginationChange",t)}}},watch:{$route:function(){this.currentPage=this._getStoragePage()||1}}}),p=(a(502),Object(i.a)(l,(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"abstract-wrapper"},[t._l(t.currentPageData,(function(e){return a("NoteAbstractItem",{key:e.path,attrs:{item:e,currentPage:t.currentPage,currentTag:t.currentTag}})})),t._v(" "),a("pagation",{staticClass:"pagation",attrs:{total:t.data.length,currentPage:t.currentPage},on:{getCurrentPage:t.getCurrentPage}})],2)}),[],!1,null,"6cc0658a",null));e.a=p.exports},505:function(t,e,a){"use strict";a(497)},506:function(t,e,a){"use strict";a(498)},508:function(t,e,a){"use strict";var n=a(66),r=(a(160),a(159)),o=a(120),c=a(490),s=Object(r.b)({props:{currentTag:{type:String,default:""}},setup:function(t,e){var a=Object(c.a)();return{tags:Object(r.a)((function(){return[{name:a.$recoLocales.all,path:"/tag/"}].concat(Object(n.a)(a.$tagesList))})),tagClick:function(t){e.emit("getCurrentTag",t)},getOneColor:o.b}}}),i=(a(506),a(15)),u=Object(i.a)(s,(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"tags"},t._l(t.tags,(function(e,n){return a("span",{directives:[{name:"show",rawName:"v-show",value:!e.pages||e.pages&&e.pages.length>0,expression:"!item.pages || (item.pages && item.pages.length > 0)"}],key:n,class:{active:e.name==t.currentTag},style:{backgroundColor:t.getOneColor()},on:{click:function(a){return t.tagClick(e)}}},[t._v(t._s(e.name))])})),0)}),[],!1,null,"285c9a44",null);e.a=u.exports},539:function(t,e,a){},583:function(t,e,a){"use strict";a(539)},590:function(t,e,a){"use strict";a.r(e);a(90);var n=a(159),r=a(507),o=a(508),c=a(503),s=a(491),i=a(504),u=a(490),g=Object(n.b)({mixins:[i.a],components:{Common:r.a,NoteAbstract:c.a,TagList:o.a,ModuleTransition:s.a},setup:function(t,e){var a=Object(u.a)();return{tagClick:function(t){a.$route.path!==t.path&&a.$router.push({path:t.path})},paginationChange:function(t){setTimeout((function(){window.scrollTo(0,0)}),100)}}}}),l=(a(496),a(505),a(583),a(15)),p=Object(l.a)(g,(function(){var t=this.$createElement,e=this._self._c||t;return e("Common",{staticClass:"tags-wrapper",attrs:{sidebar:!1}},[e("ModuleTransition",[e("TagList",{directives:[{name:"show",rawName:"v-show",value:this.recoShowModule,expression:"recoShowModule"}],attrs:{currentTag:this.$recoLocales.all},on:{getCurrentTag:this.tagClick}})],1),this._v(" "),e("ModuleTransition",{attrs:{delay:"0.08"}},[e("note-abstract",{directives:[{name:"show",rawName:"v-show",value:this.recoShowModule,expression:"recoShowModule"}],staticClass:"list",attrs:{data:this.$recoPosts},on:{paginationChange:this.paginationChange}})],1)],1)}),[],!1,null,"615c9794",null);e.default=p.exports}}]); \ No newline at end of file diff --git a/assets/js/6.6356d18d.js b/assets/js/6.6356d18d.js new file mode 100644 index 0000000..adacdea --- /dev/null +++ b/assets/js/6.6356d18d.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[6],{492:function(t,e,a){},493:function(t,e,a){},494:function(t,e,a){},495:function(t,e,a){},496:function(t,e,a){"use strict";a(492)},497:function(t,e,a){},499:function(t,e,a){"use strict";a(91);var n=a(159),r=a(491),o=a(490),c=Object(n.b)({components:{RecoIcon:r.b},props:{pageInfo:{type:Object,default:function(){return{}}},currentTag:{type:String,default:""},showAccessNumber:{type:Boolean,default:!1}},setup:function(t,e){var a=Object(o.a)();return{numStyle:{fontSize:".9rem",fontWeight:"normal",color:"#999"},goTags:function(t){a.$route.path!=="/tag/".concat(t,"/")&&a.$router.push({path:"/tag/".concat(t,"/")})},formatDateValue:function(t){return new Intl.DateTimeFormat(a.$lang).format(new Date(t))}}}}),s=(a(500),a(15)),i=Object(s.a)(c,(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",[t.pageInfo.frontmatter.author||t.$themeConfig.author?a("reco-icon",{attrs:{icon:"reco-account"}},[a("span",[t._v(t._s(t.pageInfo.frontmatter.author||t.$themeConfig.author))])]):t._e(),t._v(" "),t.pageInfo.frontmatter.date?a("reco-icon",{attrs:{icon:"reco-date"}},[a("span",[t._v(t._s(t.formatDateValue(t.pageInfo.frontmatter.date)))])]):t._e(),t._v(" "),!0===t.showAccessNumber?a("reco-icon",{attrs:{icon:"reco-eye"}},[a("AccessNumber",{attrs:{idVal:t.pageInfo.path,numStyle:t.numStyle}})],1):t._e(),t._v(" "),t.pageInfo.frontmatter.tags?a("reco-icon",{staticClass:"tags",attrs:{icon:"reco-tag"}},t._l(t.pageInfo.frontmatter.tags,(function(e,n){return a("span",{key:n,staticClass:"tag-item",class:{active:t.currentTag==e},on:{click:function(a){return a.stopPropagation(),t.goTags(e)}}},[t._v(t._s(e))])})),0):t._e()],1)}),[],!1,null,"f875f3fc",null);e.a=i.exports},500:function(t,e,a){"use strict";a(493)},501:function(t,e,a){"use strict";a(494)},502:function(t,e,a){"use strict";a(495)},503:function(t,e,a){"use strict";a(43);var n=a(159),r=(a(161),a(264),{methods:{_getStoragePage:function(){var t=window.location.pathname,e=JSON.parse(sessionStorage.getItem("currentPage"));return null===e||t!==e.path?(sessionStorage.setItem("currentPage",JSON.stringify({page:1,path:""})),1):parseInt(e.page)},_setStoragePage:function(t){var e=window.location.pathname;sessionStorage.setItem("currentPage",JSON.stringify({page:t,path:e}))}}}),o=a(491),c=a(499),s=Object(n.b)({components:{PageInfo:c.a,RecoIcon:o.b},props:["item","currentPage","currentTag"]}),i=(a(501),a(15)),u=Object(i.a)(s,(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"abstract-item",on:{click:function(e){return t.$router.push(t.item.path)}}},[t.item.frontmatter.sticky?a("reco-icon",{attrs:{icon:"reco-sticky"}}):t._e(),t._v(" "),a("div",{staticClass:"title"},[t.item.frontmatter.keys?a("reco-icon",{attrs:{icon:"reco-lock"}}):t._e(),t._v(" "),a("router-link",{attrs:{to:t.item.path}},[t._v(t._s(t.item.title))])],1),t._v(" "),a("div",{staticClass:"abstract",domProps:{innerHTML:t._s(t.item.excerpt)}}),t._v(" "),a("PageInfo",{attrs:{pageInfo:t.item,currentTag:t.currentTag}})],1)}),[],!1,null,"ff2c8be0",null).exports,g=a(490),l=Object(n.b)({mixins:[r],components:{NoteAbstractItem:u},props:["data","currentTag"],setup:function(t,e){var a=Object(g.a)(),r=Object(n.h)(t).data,o=Object(n.g)(1),c=Object(n.a)((function(){var t=(o.value-1)*a.$perPage,e=o.value*a.$perPage;return r.value.slice(t,e)}));return Object(n.d)((function(){o.value=a._getStoragePage()||1})),{currentPage:o,currentPageData:c,getCurrentPage:function(t){o.value=t,a._setStoragePage(t),e.emit("paginationChange",t)}}},watch:{$route:function(){this.currentPage=this._getStoragePage()||1}}}),p=(a(502),Object(i.a)(l,(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"abstract-wrapper"},[t._l(t.currentPageData,(function(e){return a("NoteAbstractItem",{key:e.path,attrs:{item:e,currentPage:t.currentPage,currentTag:t.currentTag}})})),t._v(" "),a("pagation",{staticClass:"pagation",attrs:{total:t.data.length,currentPage:t.currentPage},on:{getCurrentPage:t.getCurrentPage}})],2)}),[],!1,null,"6cc0658a",null));e.a=p.exports},505:function(t,e,a){"use strict";a(497)},529:function(t,e,a){},571:function(t,e,a){"use strict";a(529)},588:function(t,e,a){"use strict";a.r(e);a(90);var n=a(159),r=a(507),o=a(503),c=a(491),s=a(87),i=a(120),u=a(504),g=a(490),l=Object(n.b)({mixins:[u.a],components:{Common:r.a,NoteAbstract:o.a,ModuleTransition:c.a},setup:function(t,e){var a=Object(g.a)();return{posts:Object(n.a)((function(){var t=a.$currentCategories.pages;return t=Object(s.a)(t),Object(s.c)(t),t})),title:Object(n.a)((function(){return a.$currentCategories.key})),getCurrentTag:function(t){e.emit("currentTag",t)},paginationChange:function(t){setTimeout((function(){window.scrollTo(0,0)}),100)},getOneColor:i.b}}}),p=(a(496),a(505),a(571),a(15)),f=Object(p.a)(l,(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("Common",{staticClass:"categories-wrapper",attrs:{sidebar:!1}},[a("ModuleTransition",[a("ul",{directives:[{name:"show",rawName:"v-show",value:t.recoShowModule,expression:"recoShowModule"}],staticClass:"category-wrapper"},t._l(t.$categoriesList,(function(e,n){return a("li",{directives:[{name:"show",rawName:"v-show",value:e.pages.length>0,expression:"item.pages.length > 0"}],key:n,staticClass:"category-item",class:t.title==e.name?"active":""},[a("router-link",{attrs:{to:e.path}},[a("span",{staticClass:"category-name"},[t._v(t._s(e.name))]),t._v(" "),a("span",{staticClass:"post-num",style:{backgroundColor:t.getOneColor()}},[t._v(t._s(e.pages.length))])])],1)})),0)]),t._v(" "),a("ModuleTransition",{attrs:{delay:"0.08"}},[a("note-abstract",{directives:[{name:"show",rawName:"v-show",value:t.recoShowModule,expression:"recoShowModule"}],staticClass:"list",attrs:{data:t.posts},on:{paginationChange:t.paginationChange}})],1)],1)}),[],!1,null,"1e68bc8d",null);e.default=f.exports}}]); \ No newline at end of file diff --git a/assets/js/7.2141c153.js b/assets/js/7.2141c153.js new file mode 100644 index 0000000..8cb8955 --- /dev/null +++ b/assets/js/7.2141c153.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[7],{490:function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));n(44),n(45);var o=n(96);function r(){var e=Object(o.d)();if(!e)throw new Error("must be called in setup");return e||{}}},492:function(e,t,n){},496:function(e,t,n){"use strict";n(492)},511:function(e,t,n){},545:function(e,t,n){"use strict";n(511)},587:function(e,t,n){"use strict";n.r(t);var o=n(159),r=n(490),c=["There's nothing here.","How did we get here?","That's a Four-Oh-Four.","Looks like we've got some broken links."],u=Object(o.b)({setup:function(e,t){var n=Object(r.a)(),u=Object(o.a)((function(){return!1!==n.$themeConfig.noFoundPageByTencent}));return Object(o.d)((function(){if(u.value){var e=document.createElement("script");e.setAttribute("homePageName","回到首页"),e.setAttribute("homePageUrl",n.$site.base),e.setAttribute("src","//qzonestyle.gtimg.cn/qzone/hybrid/app/404/search_children.js"),document.body.append(e)}})),{noFoundPageByTencent:u,getMsg:function(){return c[Math.floor(Math.random()*c.length)]}}}}),s=(n(496),n(545),n(15)),i=Object(s.a)(u,(function(){var e=this,t=e.$createElement,n=e._self._c||t;return e.noFoundPageByTencent?e._e():n("section",{staticClass:"theme-container"},[n("article",{staticClass:"content"},[n("h1",[e._v("404")]),e._v(" "),n("blockquote",[e._v(e._s(e.getMsg()))]),e._v(" "),n("router-link",{attrs:{to:"/"}},[e._v("Take me home.")])],1)])}),[],!1,null,null,null);t.default=i.exports}}]); \ No newline at end of file diff --git a/assets/js/8.e3d6ceb6.js b/assets/js/8.e3d6ceb6.js new file mode 100644 index 0000000..5fdb273 --- /dev/null +++ b/assets/js/8.e3d6ceb6.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[8],{492:function(e,t,n){},496:function(e,t,n){"use strict";n(492)},540:function(e,t,n){},584:function(e,t,n){"use strict";n(540)},591:function(e,t,n){"use strict";n.r(t);n(266),n(267),n(91),n(27),n(64),n(268),n(160);var a=n(159),o=n(507),s=n(491),r=n(504),i=n(490),c=Object(a.b)({name:"TimeLine",mixins:[r.a],components:{Common:o.a,ModuleTransition:s.a},setup:function(e,t){var n=Object(i.a)();return{go:function(e){n.$router.push({path:e})},dateFormat:function(e,t){e=function(e){var t=new Date(e).toJSON();return new Date(+new Date(t)+288e5).toISOString().replace(/T/g," ").replace(/\.[\d]{3}Z/,"").replace(/-/g,"/")}(e);var n=new Date(e),a=n.getMonth()+1,o=n.getDate();return"".concat(a,"-").concat(o)}}}}),l=(n(496),n(584),n(15)),u=Object(l.a)(c,(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("Common",{staticClass:"timeline-wrapper",attrs:{sidebar:!1}},[n("ul",{staticClass:"timeline-content"},[n("ModuleTransition",[n("li",{directives:[{name:"show",rawName:"v-show",value:e.recoShowModule,expression:"recoShowModule"}],staticClass:"desc"},[e._v(e._s(e.$recoLocales.timeLineMsg))])]),e._v(" "),e._l(e.$recoPostsForTimeline,(function(t,a){return n("ModuleTransition",{key:a,attrs:{delay:String(.08*(a+1))}},[n("li",{directives:[{name:"show",rawName:"v-show",value:e.recoShowModule,expression:"recoShowModule"}]},[n("h3",{staticClass:"year"},[e._v(e._s(t.year))]),e._v(" "),n("ul",{staticClass:"year-wrapper"},e._l(t.data,(function(t,a){return n("li",{key:a},[n("span",{staticClass:"date"},[e._v(e._s(e.dateFormat(t.frontmatter.date)))]),e._v(" "),n("span",{staticClass:"title",on:{click:function(n){return e.go(t.path)}}},[e._v(e._s(t.title))])])})),0)])])}))],2)])}),[],!1,null,"42b59284",null);t.default=u.exports}}]); \ No newline at end of file diff --git a/assets/js/9.973d1d99.js b/assets/js/9.973d1d99.js new file mode 100644 index 0000000..f11a335 --- /dev/null +++ b/assets/js/9.973d1d99.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[9],{541:function(t,e,n){},585:function(t,e,n){"use strict";n(541)},616:function(t,e,n){"use strict";n.r(e);var i=n(159),r=Object(i.b)({functional:!0,props:{type:{type:String,default:"tip"},text:String,vertical:{type:String,default:"top"}},render:function(t,e){var n=e.props,i=e.slots;return t("span",{class:["badge",n.type],style:{verticalAlign:n.vertical}},n.text||i().default)}}),p=(n(585),n(15)),a=Object(p.a)(r,void 0,void 0,!1,null,"08862138",null);e.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/app.72629fdf.js b/assets/js/app.72629fdf.js new file mode 100644 index 0000000..b47ed87 --- /dev/null +++ b/assets/js/app.72629fdf.js @@ -0,0 +1,58 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[0],[]]);!function(t){function e(e){for(var r,a,s=e[0],u=e[1],c=e[2],f=0,p=[];f=0&&Math.floor(e)===e&&isFinite(t)}function d(t){return i(t)&&"function"==typeof t.then&&"function"==typeof t.catch}function h(t){return null==t?"":Array.isArray(t)||l(t)&&t.toString===c?JSON.stringify(t,null,2):String(t)}function v(t){var e=parseFloat(t);return isNaN(e)?t:e}function g(t,e){for(var n=Object.create(null),r=t.split(","),o=0;o-1)return t.splice(n,1)}}var b=Object.prototype.hasOwnProperty;function w(t,e){return b.call(t,e)}function x(t){var e=Object.create(null);return function(n){return e[n]||(e[n]=t(n))}}var _=/-(\w)/g,k=x((function(t){return t.replace(_,(function(t,e){return e?e.toUpperCase():""}))})),A=x((function(t){return t.charAt(0).toUpperCase()+t.slice(1)})),C=/\B([A-Z])/g,D=x((function(t){return t.replace(C,"-$1").toLowerCase()}));var E=Function.prototype.bind?function(t,e){return t.bind(e)}:function(t,e){function n(n){var r=arguments.length;return r?r>1?t.apply(e,arguments):t.call(e,n):t.call(e)}return n._length=t.length,n};function S(t,e){e=e||0;for(var n=t.length-e,r=new Array(n);n--;)r[n]=t[n+e];return r}function O(t,e){for(var n in e)t[n]=e[n];return t}function $(t){for(var e={},n=0;n0,J=Q&&Q.indexOf("edge/")>0,Z=(Q&&Q.indexOf("android"),Q&&/iphone|ipad|ipod|ios/.test(Q)||"ios"===G),X=(Q&&/chrome\/\d+/.test(Q),Q&&/phantomjs/.test(Q),Q&&Q.match(/firefox\/(\d+)/)),tt={}.watch,et=!1;if(H)try{var nt={};Object.defineProperty(nt,"passive",{get:function(){et=!0}}),window.addEventListener("test-passive",null,nt)}catch(t){}var rt=function(){return void 0===q&&(q=!H&&!W&&"undefined"!=typeof global&&(global.process&&"server"===global.process.env.VUE_ENV)),q},ot=H&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function it(t){return"function"==typeof t&&/native code/.test(t.toString())}var at,st="undefined"!=typeof Symbol&&it(Symbol)&&"undefined"!=typeof Reflect&&it(Reflect.ownKeys);at="undefined"!=typeof Set&&it(Set)?Set:function(){function t(){this.set=Object.create(null)}return t.prototype.has=function(t){return!0===this.set[t]},t.prototype.add=function(t){this.set[t]=!0},t.prototype.clear=function(){this.set=Object.create(null)},t}();var ut=j,ct=0,lt=function(){this.id=ct++,this.subs=[]};lt.prototype.addSub=function(t){this.subs.push(t)},lt.prototype.removeSub=function(t){y(this.subs,t)},lt.prototype.depend=function(){lt.target&<.target.addDep(this)},lt.prototype.notify=function(){var t=this.subs.slice();for(var e=0,n=t.length;e-1)if(i&&!w(o,"default"))a=!1;else if(""===a||a===D(t)){var u=Ut(String,o.type);(u<0||s0&&(fe((u=t(u,(n||"")+"_"+r))[0])&&fe(l)&&(f[c]=mt(l.text+u[0].text),u.shift()),f.push.apply(f,u)):s(u)?fe(l)?f[c]=mt(l.text+u):""!==u&&f.push(mt(u)):fe(u)&&fe(l)?f[c]=mt(l.text+u.text):(a(e._isVList)&&i(u.tag)&&o(u.key)&&i(n)&&(u.key="__vlist"+n+"_"+r+"__"),f.push(u)));return f}(t):void 0}function fe(t){return i(t)&&i(t.text)&&!1===t.isComment}function pe(t,e){if(t){for(var n=Object.create(null),r=st?Reflect.ownKeys(t):Object.keys(t),o=0;o0,a=t?!!t.$stable:!i,s=t&&t.$key;if(t){if(t._normalized)return t._normalized;if(a&&n&&n!==r&&s===n.$key&&!i&&!n.$hasNormal)return n;for(var u in o={},t)t[u]&&"$"!==u[0]&&(o[u]=me(e,u,t[u]))}else o={};for(var c in e)c in o||(o[c]=ye(e,c));return t&&Object.isExtensible(t)&&(t._normalized=o),N(o,"$stable",a),N(o,"$key",s),N(o,"$hasNormal",i),o}function me(t,e,n){var r=function(){var t=arguments.length?n.apply(null,arguments):n({}),e=(t=t&&"object"==typeof t&&!Array.isArray(t)?[t]:le(t))&&t[0];return t&&(!e||1===t.length&&e.isComment&&!ve(e))?void 0:t};return n.proxy&&Object.defineProperty(t,e,{get:r,enumerable:!0,configurable:!0}),r}function ye(t,e){return function(){return t[e]}}function be(t,e){var n,r,o,a,s;if(Array.isArray(t)||"string"==typeof t)for(n=new Array(t.length),r=0,o=t.length;rdocument.createEvent("Event").timeStamp&&(cn=function(){return ln.now()})}function fn(){var t,e;for(un=cn(),an=!0,en.sort((function(t,e){return t.id-e.id})),sn=0;snsn&&en[n].id>t.id;)n--;en.splice(n+1,0,t)}else en.push(t);on||(on=!0,ne(fn))}}(this)},dn.prototype.run=function(){if(this.active){var t=this.get();if(t!==this.value||u(t)||this.deep){var e=this.value;if(this.value=t,this.user){var n='callback for watcher "'+this.expression+'"';Vt(this.cb,this.vm,[t,e],this.vm,n)}else this.cb.call(this.vm,t,e)}}},dn.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},dn.prototype.depend=function(){for(var t=this.deps.length;t--;)this.deps[t].depend()},dn.prototype.teardown=function(){if(this.active){this.vm._isBeingDestroyed||y(this.vm._watchers,this);for(var t=this.deps.length;t--;)this.deps[t].removeSub(this);this.active=!1}};var hn={enumerable:!0,configurable:!0,get:j,set:j};function vn(t,e,n){hn.get=function(){return this[e][n]},hn.set=function(t){this[e][n]=t},Object.defineProperty(t,n,hn)}function gn(t){t._watchers=[];var e=t.$options;e.props&&function(t,e){var n=t.$options.propsData||{},r=t._props={},o=t.$options._propKeys=[];t.$parent&&kt(!1);var i=function(i){o.push(i);var a=Lt(i,e,n,t);Dt(r,i,a),i in t||vn(t,"_props",i)};for(var a in e)i(a);kt(!0)}(t,e.props),e.methods&&function(t,e){t.$options.props;for(var n in e)t[n]="function"!=typeof e[n]?j:E(e[n],t)}(t,e.methods),e.data?function(t){var e=t.$options.data;l(e=t._data="function"==typeof e?function(t,e){pt();try{return t.call(e,e)}catch(t){return qt(t,e,"data()"),{}}finally{dt()}}(e,t):e||{})||(e={});var n=Object.keys(e),r=t.$options.props,o=(t.$options.methods,n.length);for(;o--;){var i=n[o];0,r&&w(r,i)||(a=void 0,36!==(a=(i+"").charCodeAt(0))&&95!==a&&vn(t,"_data",i))}var a;Ct(e,!0)}(t):Ct(t._data={},!0),e.computed&&function(t,e){var n=t._computedWatchers=Object.create(null),r=rt();for(var o in e){var i=e[o],a="function"==typeof i?i:i.get;0,r||(n[o]=new dn(t,a||j,j,mn)),o in t||yn(t,o,i)}}(t,e.computed),e.watch&&e.watch!==tt&&function(t,e){for(var n in e){var r=e[n];if(Array.isArray(r))for(var o=0;o-1:"string"==typeof t?t.split(",").indexOf(e)>-1:!!f(t)&&t.test(e)}function Sn(t,e){var n=t.cache,r=t.keys,o=t._vnode;for(var i in n){var a=n[i];if(a){var s=a.name;s&&!e(s)&&On(n,i,r,o)}}}function On(t,e,n,r){var o=t[e];!o||r&&o.tag===r.tag||o.componentInstance.$destroy(),t[e]=null,y(n,e)}!function(t){t.prototype._init=function(t){var e=this;e._uid=_n++,e._isVue=!0,t&&t._isComponent?function(t,e){var n=t.$options=Object.create(t.constructor.options),r=e._parentVnode;n.parent=e.parent,n._parentVnode=r;var o=r.componentOptions;n.propsData=o.propsData,n._parentListeners=o.listeners,n._renderChildren=o.children,n._componentTag=o.tag,e.render&&(n.render=e.render,n.staticRenderFns=e.staticRenderFns)}(e,t):e.$options=Rt(kn(e.constructor),t||{},e),e._renderProxy=e,e._self=e,function(t){var e=t.$options,n=e.parent;if(n&&!e.abstract){for(;n.$options.abstract&&n.$parent;)n=n.$parent;n.$children.push(t)}t.$parent=n,t.$root=n?n.$root:t,t.$children=[],t.$refs={},t._watcher=null,t._inactive=null,t._directInactive=!1,t._isMounted=!1,t._isDestroyed=!1,t._isBeingDestroyed=!1}(e),function(t){t._events=Object.create(null),t._hasHookEvent=!1;var e=t.$options._parentListeners;e&&Ye(t,e)}(e),function(t){t._vnode=null,t._staticTrees=null;var e=t.$options,n=t.$vnode=e._parentVnode,o=n&&n.context;t.$slots=de(e._renderChildren,o),t.$scopedSlots=r,t._c=function(e,n,r,o){return Ne(t,e,n,r,o,!1)},t.$createElement=function(e,n,r,o){return Ne(t,e,n,r,o,!0)};var i=n&&n.data;Dt(t,"$attrs",i&&i.attrs||r,null,!0),Dt(t,"$listeners",e._parentListeners||r,null,!0)}(e),tn(e,"beforeCreate"),function(t){var e=pe(t.$options.inject,t);e&&(kt(!1),Object.keys(e).forEach((function(n){Dt(t,n,e[n])})),kt(!0))}(e),gn(e),function(t){var e=t.$options.provide;e&&(t._provided="function"==typeof e?e.call(t):e)}(e),tn(e,"created"),e.$options.el&&e.$mount(e.$options.el)}}(An),function(t){var e={get:function(){return this._data}},n={get:function(){return this._props}};Object.defineProperty(t.prototype,"$data",e),Object.defineProperty(t.prototype,"$props",n),t.prototype.$set=Et,t.prototype.$delete=St,t.prototype.$watch=function(t,e,n){if(l(e))return xn(this,t,e,n);(n=n||{}).user=!0;var r=new dn(this,t,e,n);if(n.immediate){var o='callback for immediate watcher "'+r.expression+'"';pt(),Vt(e,this,[r.value],this,o),dt()}return function(){r.teardown()}}}(An),function(t){var e=/^hook:/;t.prototype.$on=function(t,n){var r=this;if(Array.isArray(t))for(var o=0,i=t.length;o1?S(n):n;for(var r=S(arguments,1),o='event handler for "'+t+'"',i=0,a=n.length;iparseInt(this.max)&&On(t,e[0],e,this._vnode),this.vnodeToCache=null}}},created:function(){this.cache=Object.create(null),this.keys=[]},destroyed:function(){for(var t in this.cache)On(this.cache,t,this.keys)},mounted:function(){var t=this;this.cacheVNode(),this.$watch("include",(function(e){Sn(t,(function(t){return En(e,t)}))})),this.$watch("exclude",(function(e){Sn(t,(function(t){return!En(e,t)}))}))},updated:function(){this.cacheVNode()},render:function(){var t=this.$slots.default,e=He(t),n=e&&e.componentOptions;if(n){var r=Dn(n),o=this.include,i=this.exclude;if(o&&(!r||!En(o,r))||i&&r&&En(i,r))return e;var a=this.cache,s=this.keys,u=null==e.key?n.Ctor.cid+(n.tag?"::"+n.tag:""):e.key;a[u]?(e.componentInstance=a[u].componentInstance,y(s,u),s.push(u)):(this.vnodeToCache=e,this.keyToCache=u),e.data.keepAlive=!0}return e||t&&t[0]}}};!function(t){var e={get:function(){return B}};Object.defineProperty(t,"config",e),t.util={warn:ut,extend:O,mergeOptions:Rt,defineReactive:Dt},t.set=Et,t.delete=St,t.nextTick=ne,t.observable=function(t){return Ct(t),t},t.options=Object.create(null),M.forEach((function(e){t.options[e+"s"]=Object.create(null)})),t.options._base=t,O(t.options.components,jn),function(t){t.use=function(t){var e=this._installedPlugins||(this._installedPlugins=[]);if(e.indexOf(t)>-1)return this;var n=S(arguments,1);return n.unshift(this),"function"==typeof t.install?t.install.apply(t,n):"function"==typeof t&&t.apply(null,n),e.push(t),this}}(t),function(t){t.mixin=function(t){return this.options=Rt(this.options,t),this}}(t),Cn(t),function(t){M.forEach((function(e){t[e]=function(t,n){return n?("component"===e&&l(n)&&(n.name=n.name||t,n=this.options._base.extend(n)),"directive"===e&&"function"==typeof n&&(n={bind:n,update:n}),this.options[e+"s"][t]=n,n):this.options[e+"s"][t]}}))}(t)}(An),Object.defineProperty(An.prototype,"$isServer",{get:rt}),Object.defineProperty(An.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Object.defineProperty(An,"FunctionalRenderContext",{value:Pe}),An.version="2.6.14";var Tn=g("style,class"),Fn=g("input,textarea,option,select,progress"),Pn=g("contenteditable,draggable,spellcheck"),In=g("events,caret,typing,plaintext-only"),Rn=g("allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,truespeed,typemustmatch,visible"),Mn="http://www.w3.org/1999/xlink",Ln=function(t){return":"===t.charAt(5)&&"xlink"===t.slice(0,5)},Bn=function(t){return Ln(t)?t.slice(6,t.length):""},zn=function(t){return null==t||!1===t};function Nn(t){for(var e=t.data,n=t,r=t;i(r.componentInstance);)(r=r.componentInstance._vnode)&&r.data&&(e=Un(r.data,e));for(;i(n=n.parent);)n&&n.data&&(e=Un(e,n.data));return function(t,e){if(i(t)||i(e))return qn(t,Vn(e));return""}(e.staticClass,e.class)}function Un(t,e){return{staticClass:qn(t.staticClass,e.staticClass),class:i(t.class)?[t.class,e.class]:e.class}}function qn(t,e){return t?e?t+" "+e:t:e||""}function Vn(t){return Array.isArray(t)?function(t){for(var e,n="",r=0,o=t.length;r-1?dr(t,e,n):Rn(e)?zn(n)?t.removeAttribute(e):(n="allowfullscreen"===e&&"EMBED"===t.tagName?"true":e,t.setAttribute(e,n)):Pn(e)?t.setAttribute(e,function(t,e){return zn(e)||"false"===e?"false":"contenteditable"===t&&In(e)?e:"true"}(e,n)):Ln(e)?zn(n)?t.removeAttributeNS(Mn,Bn(e)):t.setAttributeNS(Mn,e,n):dr(t,e,n)}function dr(t,e,n){if(zn(n))t.removeAttribute(e);else{if(Y&&!K&&"TEXTAREA"===t.tagName&&"placeholder"===e&&""!==n&&!t.__ieph){var r=function(e){e.stopImmediatePropagation(),t.removeEventListener("input",r)};t.addEventListener("input",r),t.__ieph=!0}t.setAttribute(e,n)}}var hr={create:fr,update:fr};function vr(t,e){var n=e.elm,r=e.data,a=t.data;if(!(o(r.staticClass)&&o(r.class)&&(o(a)||o(a.staticClass)&&o(a.class)))){var s=Nn(e),u=n._transitionClasses;i(u)&&(s=qn(s,Vn(u))),s!==n._prevClass&&(n.setAttribute("class",s),n._prevClass=s)}}var gr,mr={create:vr,update:vr};function yr(t,e,n){var r=gr;return function o(){var i=e.apply(null,arguments);null!==i&&xr(t,o,n,r)}}var br=Qt&&!(X&&Number(X[1])<=53);function wr(t,e,n,r){if(br){var o=un,i=e;e=i._wrapper=function(t){if(t.target===t.currentTarget||t.timeStamp>=o||t.timeStamp<=0||t.target.ownerDocument!==document)return i.apply(this,arguments)}}gr.addEventListener(t,e,et?{capture:n,passive:r}:n)}function xr(t,e,n,r){(r||gr).removeEventListener(t,e._wrapper||e,n)}function _r(t,e){if(!o(t.data.on)||!o(e.data.on)){var n=e.data.on||{},r=t.data.on||{};gr=e.elm,function(t){if(i(t.__r)){var e=Y?"change":"input";t[e]=[].concat(t.__r,t[e]||[]),delete t.__r}i(t.__c)&&(t.change=[].concat(t.__c,t.change||[]),delete t.__c)}(n),se(n,r,wr,xr,yr,e.context),gr=void 0}}var kr,Ar={create:_r,update:_r};function Cr(t,e){if(!o(t.data.domProps)||!o(e.data.domProps)){var n,r,a=e.elm,s=t.data.domProps||{},u=e.data.domProps||{};for(n in i(u.__ob__)&&(u=e.data.domProps=O({},u)),s)n in u||(a[n]="");for(n in u){if(r=u[n],"textContent"===n||"innerHTML"===n){if(e.children&&(e.children.length=0),r===s[n])continue;1===a.childNodes.length&&a.removeChild(a.childNodes[0])}if("value"===n&&"PROGRESS"!==a.tagName){a._value=r;var c=o(r)?"":String(r);Dr(a,c)&&(a.value=c)}else if("innerHTML"===n&&Gn(a.tagName)&&o(a.innerHTML)){(kr=kr||document.createElement("div")).innerHTML=""+r+"";for(var l=kr.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;l.firstChild;)a.appendChild(l.firstChild)}else if(r!==s[n])try{a[n]=r}catch(t){}}}}function Dr(t,e){return!t.composing&&("OPTION"===t.tagName||function(t,e){var n=!0;try{n=document.activeElement!==t}catch(t){}return n&&t.value!==e}(t,e)||function(t,e){var n=t.value,r=t._vModifiers;if(i(r)){if(r.number)return v(n)!==v(e);if(r.trim)return n.trim()!==e.trim()}return n!==e}(t,e))}var Er={create:Cr,update:Cr},Sr=x((function(t){var e={},n=/:(.+)/;return t.split(/;(?![^(]*\))/g).forEach((function(t){if(t){var r=t.split(n);r.length>1&&(e[r[0].trim()]=r[1].trim())}})),e}));function Or(t){var e=$r(t.style);return t.staticStyle?O(t.staticStyle,e):e}function $r(t){return Array.isArray(t)?$(t):"string"==typeof t?Sr(t):t}var jr,Tr=/^--/,Fr=/\s*!important$/,Pr=function(t,e,n){if(Tr.test(e))t.style.setProperty(e,n);else if(Fr.test(n))t.style.setProperty(D(e),n.replace(Fr,""),"important");else{var r=Rr(e);if(Array.isArray(n))for(var o=0,i=n.length;o-1?e.split(Br).forEach((function(e){return t.classList.add(e)})):t.classList.add(e);else{var n=" "+(t.getAttribute("class")||"")+" ";n.indexOf(" "+e+" ")<0&&t.setAttribute("class",(n+e).trim())}}function Nr(t,e){if(e&&(e=e.trim()))if(t.classList)e.indexOf(" ")>-1?e.split(Br).forEach((function(e){return t.classList.remove(e)})):t.classList.remove(e),t.classList.length||t.removeAttribute("class");else{for(var n=" "+(t.getAttribute("class")||"")+" ",r=" "+e+" ";n.indexOf(r)>=0;)n=n.replace(r," ");(n=n.trim())?t.setAttribute("class",n):t.removeAttribute("class")}}function Ur(t){if(t){if("object"==typeof t){var e={};return!1!==t.css&&O(e,qr(t.name||"v")),O(e,t),e}return"string"==typeof t?qr(t):void 0}}var qr=x((function(t){return{enterClass:t+"-enter",enterToClass:t+"-enter-to",enterActiveClass:t+"-enter-active",leaveClass:t+"-leave",leaveToClass:t+"-leave-to",leaveActiveClass:t+"-leave-active"}})),Vr=H&&!K,Hr="transition",Wr="transitionend",Gr="animation",Qr="animationend";Vr&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(Hr="WebkitTransition",Wr="webkitTransitionEnd"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(Gr="WebkitAnimation",Qr="webkitAnimationEnd"));var Yr=H?window.requestAnimationFrame?window.requestAnimationFrame.bind(window):setTimeout:function(t){return t()};function Kr(t){Yr((function(){Yr(t)}))}function Jr(t,e){var n=t._transitionClasses||(t._transitionClasses=[]);n.indexOf(e)<0&&(n.push(e),zr(t,e))}function Zr(t,e){t._transitionClasses&&y(t._transitionClasses,e),Nr(t,e)}function Xr(t,e,n){var r=eo(t,e),o=r.type,i=r.timeout,a=r.propCount;if(!o)return n();var s="transition"===o?Wr:Qr,u=0,c=function(){t.removeEventListener(s,l),n()},l=function(e){e.target===t&&++u>=a&&c()};setTimeout((function(){u0&&(n="transition",l=a,f=i.length):"animation"===e?c>0&&(n="animation",l=c,f=u.length):f=(n=(l=Math.max(a,c))>0?a>c?"transition":"animation":null)?"transition"===n?i.length:u.length:0,{type:n,timeout:l,propCount:f,hasTransform:"transition"===n&&to.test(r[Hr+"Property"])}}function no(t,e){for(;t.length1}function uo(t,e){!0!==e.data.show&&oo(e)}var co=function(t){var e,n,r={},u=t.modules,c=t.nodeOps;for(e=0;eh?b(t,o(n[m+1])?null:n[m+1].elm,n,d,m,r):d>m&&x(e,p,h)}(p,g,m,n,l):i(m)?(i(t.text)&&c.setTextContent(p,""),b(p,null,m,0,m.length-1,n)):i(g)?x(g,0,g.length-1):i(t.text)&&c.setTextContent(p,""):t.text!==e.text&&c.setTextContent(p,e.text),i(h)&&i(d=h.hook)&&i(d=d.postpatch)&&d(t,e)}}}function C(t,e,n){if(a(n)&&i(t.parent))t.parent.data.pendingInsert=e;else for(var r=0;r-1,a.selected!==i&&(a.selected=i);else if(P(vo(a),r))return void(t.selectedIndex!==s&&(t.selectedIndex=s));o||(t.selectedIndex=-1)}}function ho(t,e){return e.every((function(e){return!P(e,t)}))}function vo(t){return"_value"in t?t._value:t.value}function go(t){t.target.composing=!0}function mo(t){t.target.composing&&(t.target.composing=!1,yo(t.target,"input"))}function yo(t,e){var n=document.createEvent("HTMLEvents");n.initEvent(e,!0,!0),t.dispatchEvent(n)}function bo(t){return!t.componentInstance||t.data&&t.data.transition?t:bo(t.componentInstance._vnode)}var wo={model:lo,show:{bind:function(t,e,n){var r=e.value,o=(n=bo(n)).data&&n.data.transition,i=t.__vOriginalDisplay="none"===t.style.display?"":t.style.display;r&&o?(n.data.show=!0,oo(n,(function(){t.style.display=i}))):t.style.display=r?i:"none"},update:function(t,e,n){var r=e.value;!r!=!e.oldValue&&((n=bo(n)).data&&n.data.transition?(n.data.show=!0,r?oo(n,(function(){t.style.display=t.__vOriginalDisplay})):io(n,(function(){t.style.display="none"}))):t.style.display=r?t.__vOriginalDisplay:"none")},unbind:function(t,e,n,r,o){o||(t.style.display=t.__vOriginalDisplay)}}},xo={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]};function _o(t){var e=t&&t.componentOptions;return e&&e.Ctor.options.abstract?_o(He(e.children)):t}function ko(t){var e={},n=t.$options;for(var r in n.propsData)e[r]=t[r];var o=n._parentListeners;for(var i in o)e[k(i)]=o[i];return e}function Ao(t,e){if(/\d-keep-alive$/.test(e.tag))return t("keep-alive",{props:e.componentOptions.propsData})}var Co=function(t){return t.tag||ve(t)},Do=function(t){return"show"===t.name},Eo={name:"transition",props:xo,abstract:!0,render:function(t){var e=this,n=this.$slots.default;if(n&&(n=n.filter(Co)).length){0;var r=this.mode;0;var o=n[0];if(function(t){for(;t=t.parent;)if(t.data.transition)return!0}(this.$vnode))return o;var i=_o(o);if(!i)return o;if(this._leaving)return Ao(t,o);var a="__transition-"+this._uid+"-";i.key=null==i.key?i.isComment?a+"comment":a+i.tag:s(i.key)?0===String(i.key).indexOf(a)?i.key:a+i.key:i.key;var u=(i.data||(i.data={})).transition=ko(this),c=this._vnode,l=_o(c);if(i.data.directives&&i.data.directives.some(Do)&&(i.data.show=!0),l&&l.data&&!function(t,e){return e.key===t.key&&e.tag===t.tag}(i,l)&&!ve(l)&&(!l.componentInstance||!l.componentInstance._vnode.isComment)){var f=l.data.transition=O({},u);if("out-in"===r)return this._leaving=!0,ue(f,"afterLeave",(function(){e._leaving=!1,e.$forceUpdate()})),Ao(t,o);if("in-out"===r){if(ve(i))return c;var p,d=function(){p()};ue(u,"afterEnter",d),ue(u,"enterCancelled",d),ue(f,"delayLeave",(function(t){p=t}))}}return o}}},So=O({tag:String,moveClass:String},xo);function Oo(t){t.elm._moveCb&&t.elm._moveCb(),t.elm._enterCb&&t.elm._enterCb()}function $o(t){t.data.newPos=t.elm.getBoundingClientRect()}function jo(t){var e=t.data.pos,n=t.data.newPos,r=e.left-n.left,o=e.top-n.top;if(r||o){t.data.moved=!0;var i=t.elm.style;i.transform=i.WebkitTransform="translate("+r+"px,"+o+"px)",i.transitionDuration="0s"}}delete So.mode;var To={Transition:Eo,TransitionGroup:{props:So,beforeMount:function(){var t=this,e=this._update;this._update=function(n,r){var o=Je(t);t.__patch__(t._vnode,t.kept,!1,!0),t._vnode=t.kept,o(),e.call(t,n,r)}},render:function(t){for(var e=this.tag||this.$vnode.data.tag||"span",n=Object.create(null),r=this.prevChildren=this.children,o=this.$slots.default||[],i=this.children=[],a=ko(this),s=0;s-1?Yn[t]=e.constructor===window.HTMLUnknownElement||e.constructor===window.HTMLElement:Yn[t]=/HTMLUnknownElement/.test(e.toString())},O(An.options.directives,wo),O(An.options.components,To),An.prototype.__patch__=H?co:j,An.prototype.$mount=function(t,e){return function(t,e,n){var r;return t.$el=e,t.$options.render||(t.$options.render=gt),tn(t,"beforeMount"),r=function(){t._update(t._render(),n)},new dn(t,r,j,{before:function(){t._isMounted&&!t._isDestroyed&&tn(t,"beforeUpdate")}},!0),n=!1,null==t.$vnode&&(t._isMounted=!0,tn(t,"mounted")),t}(this,t=t&&H?function(t){if("string"==typeof t){var e=document.querySelector(t);return e||document.createElement("div")}return t}(t):void 0,e)},H&&setTimeout((function(){B.devtools&&ot&&ot.emit("init",An)}),0),e.default=An},function(t,e,n){var r=n(0),o=n(42).f,i=n(31),a=n(18),s=n(125),u=n(131),c=n(104);t.exports=function(t,e){var n,l,f,p,d,h=t.target,v=t.global,g=t.stat;if(n=v?r:g?r[h]||s(h,{}):(r[h]||{}).prototype)for(l in e){if(p=e[l],f=t.noTargetGet?(d=o(n,l))&&d.value:n[l],!c(v?l:h+(g?".":"#")+l,t.forced)&&void 0!==f){if(typeof p==typeof f)continue;u(p,f)}(t.sham||f&&f.sham)&&i(p,"sham",!0),a(n,l,p,t)}}},function(t,e,n){var r=n(69),o=Function.prototype,i=o.bind,a=o.call,s=r&&i.bind(a,a);t.exports=r?function(t){return t&&s(t)}:function(t){return t&&function(){return a.apply(t,arguments)}}},function(t,e){t.exports=function(t){try{return!!t()}catch(t){return!0}}},function(t,e){t.exports=function(t){return"function"==typeof t}},function(t,e,n){var r=n(0),o=n(52),i=n(11),a=n(97),s=n(53),u=n(171),c=o("wks"),l=r.Symbol,f=l&&l.for,p=u?l:l&&l.withoutSetter||a;t.exports=function(t){if(!i(c,t)||!s&&"string"!=typeof c[t]){var e="Symbol."+t;s&&i(l,t)?c[t]=l[t]:c[t]=u&&f?f(e):p(e)}return c[t]}},function(t,e,n){"use strict";n.d(e,"a",(function(){return f}));var r=n(1); +/** + * vue-class-component v7.2.6 + * (c) 2015-present Evan You + * @license MIT + */function o(t){return(o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function i(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function a(t){return function(t){if(Array.isArray(t)){for(var e=0,n=new Array(t.length);e1&&void 0!==arguments[1]?arguments[1]:{};e.name=e.name||t._componentTag||t.name;var n=t.prototype;Object.getOwnPropertyNames(n).forEach((function(t){if("constructor"!==t)if(d.indexOf(t)>-1)e[t]=n[t];else{var r=Object.getOwnPropertyDescriptor(n,t);void 0!==r.value?"function"==typeof r.value?(e.methods||(e.methods={}))[t]=r.value:(e.mixins||(e.mixins=[])).push({data:function(){return i({},t,r.value)}}):(r.get||r.set)&&((e.computed||(e.computed={}))[t]={get:r.get,set:r.set})}})),(e.mixins||(e.mixins=[])).push({data:function(){return p(this,t)}});var o=t.__decorators__;o&&(o.forEach((function(t){return t(e)})),delete t.__decorators__);var a=Object.getPrototypeOf(t.prototype),c=a instanceof r.default?a.constructor:r.default,l=c.extend(e);return g(l,t,c),s()&&u(l,t),l}var v={prototype:!0,arguments:!0,callee:!0,caller:!0};function g(t,e,n){Object.getOwnPropertyNames(e).forEach((function(r){if(!v[r]){var i=Object.getOwnPropertyDescriptor(t,r);if(!i||i.configurable){var a,s,u=Object.getOwnPropertyDescriptor(e,r);if(!l){if("cid"===r)return;var c=Object.getOwnPropertyDescriptor(n,r);if(a=u.value,s=o(a),null!=a&&("object"===s||"function"===s)&&c&&c.value===u.value)return}0,Object.defineProperty(t,r,u)}}}))}function m(t){return"function"==typeof t?h(t):function(e){return h(e,t)}}m.registerHooks=function(t){d.push.apply(d,a(t))},e.b=m},function(t,e,n){var r=n(134),o=n(18),i=n(297);r||o(Object.prototype,"toString",i,{unsafe:!0})},function(t,e,n){var r=n(4);t.exports=!r((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},function(t,e,n){var r=n(69),o=Function.prototype.call;t.exports=r?o.bind(o):function(){return o.apply(o,arguments)}},function(t,e,n){var r=n(3),o=n(20),i=r({}.hasOwnProperty);t.exports=Object.hasOwn||function(t,e){return i(o(t),e)}},function(t,e,n){var r=n(0),o=n(107),i=r.String;t.exports=function(t){if("Symbol"===o(t))throw TypeError("Cannot convert a Symbol value to a string");return i(t)}},function(t,e,n){var r=n(0),o=n(14),i=r.String,a=r.TypeError;t.exports=function(t){if(o(t))return t;throw a(i(t)+" is not an object")}},function(t,e,n){var r=n(5);t.exports=function(t){return"object"==typeof t?null!==t:r(t)}},function(t,e,n){"use strict";function r(t,e,n,r,o,i,a,s){var u,c="function"==typeof t?t.options:t;if(e&&(c.render=e,c.staticRenderFns=n,c._compiled=!0),r&&(c.functional=!0),i&&(c._scopeId="data-v-"+i),a?(u=function(t){(t=t||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext)||"undefined"==typeof __VUE_SSR_CONTEXT__||(t=__VUE_SSR_CONTEXT__),o&&o.call(this,t),t&&t._registeredComponents&&t._registeredComponents.add(a)},c._ssrRegister=u):o&&(u=s?function(){o.call(this,(c.functional?this.parent:this).$root.$options.shadowRoot)}:o),u)if(c.functional){c._injectStyles=u;var l=c.render;c.render=function(t,e){return u.call(e),l(t,e)}}else{var f=c.beforeCreate;c.beforeCreate=f?[].concat(f,u):[u]}return{exports:t,options:c}}n.d(e,"a",(function(){return r}))},function(t,e,n){var r=n(0),o=n(9),i=n(173),a=n(172),s=n(13),u=n(99),c=r.TypeError,l=Object.defineProperty,f=Object.getOwnPropertyDescriptor;e.f=o?a?function(t,e,n){if(s(t),e=u(e),s(n),"function"==typeof t&&"prototype"===e&&"value"in n&&"writable"in n&&!n.writable){var r=f(t,e);r&&r.writable&&(t[e]=n.value,n={configurable:"configurable"in n?n.configurable:r.configurable,enumerable:"enumerable"in n?n.enumerable:r.enumerable,writable:!1})}return l(t,e,n)}:l:function(t,e,n){if(s(t),e=u(e),s(n),i)try{return l(t,e,n)}catch(t){}if("get"in n||"set"in n)throw c("Accessors not supported");return"value"in n&&(t[e]=n.value),t}},function(t,e,n){"use strict";n.d(e,"a",(function(){return i}));n(92),n(84),n(28),n(8),n(265),n(82),n(83),n(196),n(429),n(93);var r=n(88);function o(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,r)}return n}function i(t){for(var e=1;e1?arguments[1]:void 0)}})},function(t,e,n){var r=n(3),o=r({}.toString),i=r("".slice);t.exports=function(t){return i(o(t),8,-1)}},function(t,e,n){var r=n(0),o=n(5),i=n(71),a=r.TypeError;t.exports=function(t){if(o(t))return t;throw a(i(t)+" is not a function")}},function(t,e,n){var r=n(9),o=n(16),i=n(57);t.exports=r?function(t,e,n){return o.f(t,e,i(1,n))}:function(t,e,n){return t[e]=n,t}},function(t,e,n){t.exports=n(464)},function(t,e,n){var r=n(56);t.exports=function(t){return r(t.length)}},function(t,e,n){var r=n(3);t.exports=r({}.isPrototypeOf)},function(t,e,n){var r,o,i,a=n(276),s=n(0),u=n(3),c=n(14),l=n(31),f=n(11),p=n(124),d=n(101),h=n(72),v=s.TypeError,g=s.WeakMap;if(a||p.state){var m=p.state||(p.state=new g),y=u(m.get),b=u(m.has),w=u(m.set);r=function(t,e){if(b(m,t))throw new v("Object already initialized");return e.facade=t,w(m,t,e),e},o=function(t){return y(m,t)||{}},i=function(t){return b(m,t)}}else{var x=d("state");h[x]=!0,r=function(t,e){if(f(t,x))throw new v("Object already initialized");return e.facade=t,l(t,x,e),e},o=function(t){return f(t,x)?t[x]:{}},i=function(t){return f(t,x)}}t.exports={set:r,get:o,has:i,enforce:function(t){return i(t)?o(t):r(t,{})},getterFor:function(t){return function(e){var n;if(!c(e)||(n=o(e)).type!==t)throw v("Incompatible receiver, "+t+" required");return n}}}},function(t,e,n){"use strict";var r=n(193).charAt,o=n(12),i=n(35),a=n(176),s=i.set,u=i.getterFor("String Iterator");a(String,"String",(function(t){s(this,{type:"String Iterator",string:o(t),index:0})}),(function(){var t,e=u(this),n=e.string,o=e.index;return o>=n.length?{value:void 0,done:!0}:(t=r(n,o),e.index+=t.length,{value:t,done:!1})}))},function(t,e,n){var r=n(215),o="object"==typeof self&&self&&self.Object===Object&&self,i=r||o||Function("return this")();t.exports=i},function(t,e){var n=Array.isArray;t.exports=n},function(t,e,n){var r=n(0),o=n(194),i=n(195),a=n(169),s=n(31),u=n(6),c=u("iterator"),l=u("toStringTag"),f=a.values,p=function(t,e){if(t){if(t[c]!==f)try{s(t,c,f)}catch(e){t[c]=f}if(t[l]||s(t,l,e),o[e])for(var n in a)if(t[n]!==a[n])try{s(t,n,a[n])}catch(e){t[n]=a[n]}}};for(var d in o)p(r[d]&&r[d].prototype,d);p(i,"DOMTokenList")},function(t,e,n){var r=n(19);t.exports=r("navigator","userAgent")||""},function(t,e,n){var r,o=n(13),i=n(126),a=n(129),s=n(72),u=n(175),c=n(98),l=n(101),f=l("IE_PROTO"),p=function(){},d=function(t){return" + + + + + + + + +

C/C++/MySQL/Redis/操作系统/八股文/Leetcode

7/11/2022 知识

# 一、C/C++语言相关,常见题型

# 1、static

# 修饰的对象

1、变量 2、函数

# 场景

1、函数体

  • 作用范围 只能在函数内访问

2、模块内(文件内)

  • 作用范围 +
    • 源文件 在该文件类使用
    • 头文件 在包含的文件内都可以使用
  • 避免命名重复

3、类中

  • 修饰成员变量:属于整个类所拥有,无this指针
  • 修饰成员函数:属于整个类所拥有,无this指针,只能访问静态成员变量,不能访问成员函数成员变量

img

# 2、const

# 使用场景

1、变量;2、函数参数;3、函数返回值;4、常成员函数

  • 局部const

img

# 未完待续。。。

+ + + diff --git a/blogs/acknowledge/c1000ktest.html b/blogs/acknowledge/c1000ktest.html new file mode 100644 index 0000000..5f1a827 --- /dev/null +++ b/blogs/acknowledge/c1000ktest.html @@ -0,0 +1,628 @@ + + + + + + c1000k,单机百万并发测试 | 斯人如彩虹 + + + + + + + + + + + +

c1000k,单机百万并发测试

6/19/2022 知识

# c1000k,单机百万并发测试

使用epoll实现的reactor服务端,开启一个进程多个端口,然后使用多个客户端 ip 多端口来连接

​ 1、在16g内存的笔记本上

​ 2、用四台虚拟机(一台服务器 三台客户端)

​ 3、使用epoll写的reactor反应堆服务端,源码在最下面

​ 4、多线程的客户端,源码在最下面

​ 并发:一个服务器能够同时承载客户端的数量

​ 服务器能同时建立连接的数量 是并发的基础

​ 承载 100w 在200ms内返回

​ 这里回声服务器 没有下列多余影响

​ 1、数据库 2、网络带宽 3、内存操作 4、日志

# 一、一个连接的定义

# 1.1 服务器理论最大并发数

​ 一个连接包含五元组,源ip(sip)、目的ip(dip)源端口(sport)、目的端、(dport) 协议

2 的 32 次方(源ip数)× 2的 16 次方(源port数)× 2 的 32 次方(目的ip数)× 2的 16 次方(目的port数)大约等于四百多亿亿亿

(不过每条连接都会消耗服内存,实践中绝不可能达到这个理论数字。)

# 1.2 测试实验配置

这里使用一个服务端ip * 100服务端端口 * 60000客户端端口 * 3 个客户端 理论上可以达到200w连接 奈何笔记本内存不够

sip 多个客户端 这里采用三个虚拟机(三个ip)

dip 服务器IP只有一个 使用一个虚拟机(一个ip)

sport 客户端数量 使用60000个端口

dport 服务的端口 使用100个端口

proto tcp 使用tcp连接

# 1.3 linux系统的连接相关默认配置

看看ubuntu20.04的默认配置

root@luo:~# ulimit -n
+1024
+root@luo:~# sysctl -a |grep mem
+...
+net.ipv4.tcp_mem = 92880	123843	185760 # 92880* 4k 300m 500m 700m 当协议栈占用空间500m时优化 大于700m时不再分配
+net.ipv4.tcp_rmem = 4096	131072	6291456
+net.ipv4.tcp_wmem = 4096	16384	4194304
+...
+net.ipv4.ip_local_port_range = 32768	60999
+fs.file-max = 9223372036854775807
+net.nf_conntrack_max = 65536
+
1
2
3
4
5
6
7
8
9
10
11

# 1.4下面解释配置的作用

1、net.ipv4.tcp_mem TCP使用了内存页面数

​ net.ipv4.tcp_rmem 为TCP socket预留用于接收缓冲的内存 +​ net.ipv4.tcp_wmem 为TCP socket预留用于发送缓冲的内存

​ tcp_wmem tcp_rmem服务器传输大文件就调大 传输字符 调小(但可能ssh 都会很慢) 一个fd就是tcp_wmem tcp_rmem所占用空间 使用更少的内存

2、ulimit -n 和 net.nf_conntrack_max fd 限制 ulimit 限制fd 数量

​ 默认单个进程打开的fd为1000多个 可以修改ulimit -n 1048576(临时修改) 或 /etc/security/limits.conf(永久修改)

accept: Too many open files
+
1

3、net.ipv4.ip_local_port_range 默认用户只能用30000以上的端口建立连接 要自己改

​ 建立连接时 服务端端口从三万多开始挨个遍历 找到一个没有被占用的

connections: 27999, sockfd:28002, time_used:3193
+connect: Cannot assign requested address
+error : Cannot assign requested address
+
1
2
3

4、net.nf_conntrack_max 服务端建立连接的syn连接数

​ iptables基于netfilter的应用程序 iptables会调用netfilrer的接口

​ 报文sk_buff从网卡上到达协议栈时会经过netfilter

conntion timeout
+
1

# 二、实验开始

# 2.1 使用sysctl临时修改配置(重启后失效)

#send buffer 服务器传输大文件就调大  传输字符 调小(但可能ssh 都会很慢) 一个fd就是tcp_wmem  tcp_rmem所占用空间 使用更少的内存
+sysctl -w net.ipv4.tcp_wmem="2048 2048 4096"
+sysctl -w net.ipv4.tcp_rmem="2048 2048 4096"
+
+sysctl -w net.ipv4.tcp_mem="262144 524288 786432" # 262144*4k 1g 2g 3g 当协议栈占用空间2g时优化 大于3g时不再分配
+sysctl -w net.ipv4.ip_local_port_range="1025 64000"
+ulimit -n 1048576
+modprobe ip_conntrack
+sysctl -w net.nf_conntrack_max=1048576
+
1
2
3
4
5
6
7
8
9

# 2.2 编译最下方源码 开启c/s回声服务器看效果

send[fd=980328], [32]Hello Server: client --> 329478

1、服务端启动后看一下内存

root@luo:~# free
+              total        used        free      shared  buff/cache   available
+Mem:        8117280     2376860     5343540        1620      396880     5485128
+Swap:       4001788           0     4001788
+
1
2
3
4

2、服务端维持980000连接时的内存

root@luo:~# free
+              total        used        free      shared  buff/cache   available
+Mem:        8117280     6973192      103992           0     1040096      913852
+Swap:       4001788     1090996     2910792
+
+
1
2
3
4
5

3、计算单条连接消耗内存

6973192 - 2376860 = 4596332 ÷ 800000= 4.69

由于笔记本开了4台虚拟机一起跑 连接总是到90多万的时候虚拟机崩溃 最多980000

平均计算一个连接4k左右

# 三、测试中的一些问题以及优化方向

文件描述符fd不够

​ 端口数量不够

​ accept 全连接队列满了

​ 客户端超时 服务端不会ack 连接队列满了?

半连接全连接 连接队列的问题 满了后需要排队

会导致网络抖动 accept线程池竞争 多线程accept

多线程的网络模型 redis memcached nginx

​ 1、accept与recv/send的fd分开

​ 2、多线程accept

​ nginx memcached多进程更符合业务处理 固定多线程接入 多线程业务处理

# 源码

reactor.c

#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/socket.h>
+#include <sys/epoll.h>
+#include <arpa/inet.h>
+
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+
+
+#define BUFFER_LENGTH       1024
+#define MAX_EPOLL_EVENTS    1024*1024 //connection 
+#define MAX_EPOLL_ITEM      102400 //con
+#define SERVER_PORT         8888
+
+#define LISTEN_PORT_COUNT   100
+
+typedef int NCALLBACK(int ,int, void*);
+
+struct ntyevent {
+    int fd;
+    int events;
+    void *arg;
+    int (*callback)(int fd, int events, void *arg);
+    
+    int status;
+    char buffer[BUFFER_LENGTH];
+    int length;
+    long last_active;
+};
+
+
+
+struct ntyreactor {
+    int epfd;
+    struct ntyevent *events; // 1024 * 1024
+};
+
+
+int recv_cb(int fd, int events, void *arg);
+int send_cb(int fd, int events, void *arg);
+
+
+void nty_event_set(struct ntyevent *ev, int fd, NCALLBACK callback, void *arg) {
+
+    ev->fd = fd;
+    ev->callback = callback;
+    ev->events = 0;
+    ev->arg = arg;
+    ev->last_active = time(NULL);
+
+    return ;
+    
+}
+
+
+int nty_event_add(int epfd, int events, struct ntyevent *ev) {
+
+    struct epoll_event ep_ev = {0, {0}};
+    ep_ev.data.ptr = ev;
+    ep_ev.events = ev->events = events;
+
+    int op;
+    if (ev->status == 1) {
+        op = EPOLL_CTL_MOD;
+    } else {
+        op = EPOLL_CTL_ADD;
+        ev->status = 1;
+    }
+
+    if (epoll_ctl(epfd, op, ev->fd, &ep_ev) < 0) {
+        printf("event add failed [fd=%d], events[%d]\n", ev->fd, events);
+        return -1;
+    }
+
+    return 0;
+}
+
+int nty_event_del(int epfd, struct ntyevent *ev) {
+
+    struct epoll_event ep_ev = {0, {0}};
+
+    if (ev->status != 1) {
+        return -1;
+    }
+
+    ep_ev.data.ptr = ev;
+    ev->status = 0;
+    epoll_ctl(epfd, EPOLL_CTL_DEL, ev->fd, &ep_ev);
+
+    return 0;
+}
+
+int recv_cb(int fd, int events, void *arg) {
+
+    struct ntyreactor *reactor = (struct ntyreactor*)arg;
+    struct ntyevent *ev = reactor->events+fd;
+
+    int len = recv(fd, ev->buffer, BUFFER_LENGTH, 0);
+    nty_event_del(reactor->epfd, ev);
+
+    if (len > 0) {
+        
+        ev->length = len;
+        ev->buffer[len] = '\0';
+
+        printf("C[%d]:%s\n", fd, ev->buffer);
+
+        nty_event_set(ev, fd, send_cb, reactor);
+        nty_event_add(reactor->epfd, EPOLLOUT, ev);
+        
+        
+    } else if (len == 0) {
+
+        close(ev->fd);
+        printf("[fd=%d] pos[%ld], closed\n", fd, ev-reactor->events);
+         
+    } else {
+
+        close(ev->fd);
+        printf("recv[fd=%d] error[%d]:%s\n", fd, errno, strerror(errno));
+        
+    }
+
+    return len;
+}
+
+
+int send_cb(int fd, int events, void *arg) {
+
+    struct ntyreactor *reactor = (struct ntyreactor*)arg;
+    struct ntyevent *ev = reactor->events+fd;
+
+    int len = send(fd, ev->buffer, ev->length, 0);
+    if (len > 0) {
+        printf("send[fd=%d], [%d]%s\n", fd, len, ev->buffer);
+
+        nty_event_del(reactor->epfd, ev);
+        
+        nty_event_set(ev, fd, recv_cb, reactor);
+        nty_event_add(reactor->epfd, EPOLLIN, ev);
+        
+    } else {
+
+        close(ev->fd);
+
+        nty_event_del(reactor->epfd, ev);
+        printf("send[fd=%d] error %s\n", fd, strerror(errno));
+
+    }
+
+    return len;
+}
+
+int accept_cb(int fd, int events, void *arg) {
+
+    struct ntyreactor *reactor = (struct ntyreactor*)arg;
+    if (reactor == NULL) return -1;
+
+    struct sockaddr_in client_addr;
+    socklen_t len = sizeof(client_addr);
+
+    int clientfd;
+
+    if ((clientfd = accept(fd, (struct sockaddr*)&client_addr, &len)) == -1) {
+        if (errno != EAGAIN && errno != EINTR) {
+            
+        }
+        printf("accept: %s\n", strerror(errno));
+        return -1;
+    }
+
+    int i = 0;
+    do {
+#if 0
+        for (i = 0;i < MAX_EPOLL_EVENTS;i ++) {
+            if (reactor->events[i].status == 0) {
+                break;
+            }
+        }
+        if (i == MAX_EPOLL_EVENTS) {
+            printf("%s: max connect limit[%d]\n", __func__, MAX_EPOLL_EVENTS);
+            break;
+        }
+#endif
+        int flag = 0;
+        if ((flag = fcntl(clientfd, F_SETFL, O_NONBLOCK)) < 0) {
+            printf("%s: fcntl nonblocking failed, %d\n", __func__, MAX_EPOLL_EVENTS);
+            break;
+        }
+
+        nty_event_set(&reactor->events[clientfd], clientfd, recv_cb, reactor);
+        nty_event_add(reactor->epfd, EPOLLIN, &reactor->events[clientfd]);
+
+    } while (0);
+
+    printf("new connect [%s:%d][time:%ld], pos[%d]\n", 
+        inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port), reactor->events[i].last_active, i);
+
+    return 0;
+
+}
+
+int init_sock(short port) {
+
+    int fd = socket(AF_INET, SOCK_STREAM, 0);
+    fcntl(fd, F_SETFL, O_NONBLOCK);
+
+    struct sockaddr_in server_addr;
+    memset(&server_addr, 0, sizeof(server_addr));
+    server_addr.sin_family = AF_INET;
+    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
+    server_addr.sin_port = htons(port);
+
+    bind(fd, (struct sockaddr*)&server_addr, sizeof(server_addr));
+
+    if (listen(fd, 20) < 0) {
+        printf("listen failed : %s\n", strerror(errno));
+    }
+
+    printf("listen port : %d\n", port);
+
+    return fd;
+}
+
+
+int ntyreactor_init(struct ntyreactor *reactor) {
+
+    if (reactor == NULL) return -1;
+    memset(reactor, 0, sizeof(struct ntyreactor));
+
+    reactor->epfd = epoll_create(1);
+    if (reactor->epfd <= 0) {
+        printf("create epfd in %s err %s\n", __func__, strerror(errno));
+        return -2;
+    }
+
+    reactor->events = (struct ntyevent*)malloc((MAX_EPOLL_EVENTS) * sizeof(struct ntyevent));
+    if (reactor->events == NULL) {
+        printf("create epfd in %s err %s\n", __func__, strerror(errno));
+        close(reactor->epfd);
+        return -3;
+    }
+}
+
+int ntyreactor_destory(struct ntyreactor *reactor) {
+
+    close(reactor->epfd);
+    free(reactor->events);
+
+}
+
+
+
+int ntyreactor_addlistener(struct ntyreactor *reactor, int sockfd, NCALLBACK *acceptor) {
+
+    if (reactor == NULL) return -1;
+    if (reactor->events == NULL) return -1;
+
+    nty_event_set(&reactor->events[sockfd], sockfd, acceptor, reactor);
+    nty_event_add(reactor->epfd, EPOLLIN, &reactor->events[sockfd]);
+
+    return 0;
+}
+
+
+
+int ntyreactor_run(struct ntyreactor *reactor) {
+    if (reactor == NULL) return -1;
+    if (reactor->epfd < 0) return -1;
+    if (reactor->events == NULL) return -1;
+    
+    struct epoll_event events[MAX_EPOLL_ITEM];
+    
+    int checkpos = 0, i;
+
+    while (1) {
+#if 0
+        long now = time(NULL);
+        for (i = 0;i < 100;i ++, checkpos ++) {
+            if (checkpos == MAX_EPOLL_EVENTS) {
+                checkpos = 0;
+            }
+
+            if (reactor->events[checkpos].status != 1) {
+                continue;
+            }
+
+            long duration = now - reactor->events[checkpos].last_active;
+
+            if (duration >= 60) {
+                close(reactor->events[checkpos].fd);
+                printf("[fd=%d] timeout\n", reactor->events[checkpos].fd);
+                nty_event_del(reactor->epfd, &reactor->events[checkpos]);
+            }
+        }
+#endif
+        //                                  一次能从就绪队列带出数量 event长度 时间
+        int nready = epoll_wait(reactor->epfd, events, MAX_EPOLL_ITEM, 1000);
+        if (nready < 0) {
+            printf("epoll_wait error, exit\n");
+            continue;
+        }
+
+        for (i = 0;i < nready;i ++) {
+
+            struct ntyevent *ev = (struct ntyevent*)events[i].data.ptr;
+
+            if ((events[i].events & EPOLLIN) && (ev->events & EPOLLIN)) {
+                ev->callback(ev->fd, events[i].events, ev->arg);
+            }
+            if ((events[i].events & EPOLLOUT) && (ev->events & EPOLLOUT)) {
+                ev->callback(ev->fd, events[i].events, ev->arg);
+            }
+            
+        }
+
+    }
+}
+
+int main(int argc, char *argv[]) {
+
+    unsigned short port = SERVER_PORT;
+    if (argc == 2) {
+        port = atoi(argv[1]);
+    }
+    struct ntyreactor *reactor = (struct ntyreactor*)malloc(sizeof(struct ntyreactor));
+    ntyreactor_init(reactor);
+    
+
+    int listenfd[LISTEN_PORT_COUNT] = {0};
+    int i = 0;
+
+    for (i = 0;i < LISTEN_PORT_COUNT;i ++) {
+        listenfd[i] = init_sock(port+i);
+        ntyreactor_addlistener(reactor, listenfd[i], accept_cb);
+    }
+    
+    ntyreactor_run(reactor);
+
+    ntyreactor_destory(reactor);
+
+    for (i = 0;i < LISTEN_PORT_COUNT;i ++) {
+        close(listenfd[i]);
+    }
+    
+
+    return 0;
+}
+
+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352

mul_port_client_epoll.c


+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/epoll.h>
+#include <errno.h>
+#include <netinet/tcp.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+#include <fcntl.h>
+
+
+#define MAX_BUFFER      128
+#define MAX_EPOLLSIZE   (384*1024)
+#define MAX_PORT        100
+
+#define TIME_SUB_MS(tv1, tv2)  ((tv1.tv_sec - tv2.tv_sec) * 1000 + (tv1.tv_usec - tv2.tv_usec) / 1000)
+
+int isContinue = 0;
+
+static int ntySetNonblock(int fd) {
+    int flags;
+
+    flags = fcntl(fd, F_GETFL, 0);
+    if (flags < 0) return flags;
+    flags |= O_NONBLOCK;
+    if (fcntl(fd, F_SETFL, flags) < 0) return -1;
+    return 0;
+}
+
+static int ntySetReUseAddr(int fd) {
+    int reuse = 1;
+    return setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *)&reuse, sizeof(reuse));
+}
+
+
+
+int main(int argc, char **argv) {
+    if (argc <= 2) {
+        printf("Usage: %s ip port\n", argv[0]);
+        exit(0);
+    }
+
+    const char *ip = argv[1];
+    int port = atoi(argv[2]);
+    int connections = 0;
+    char buffer[128] = {0};
+    int i = 0, index = 0;
+
+    struct epoll_event events[MAX_EPOLLSIZE];
+    
+    int epoll_fd = epoll_create(MAX_EPOLLSIZE);
+    
+    strcpy(buffer, " Data From MulClient\n");
+        
+    struct sockaddr_in addr;
+    memset(&addr, 0, sizeof(struct sockaddr_in));
+    
+    addr.sin_family = AF_INET;
+    addr.sin_addr.s_addr = inet_addr(ip);
+
+    struct timeval tv_begin;
+    gettimeofday(&tv_begin, NULL);
+
+    while (1) {
+        if (++index >= MAX_PORT) index = 0;
+        
+        struct epoll_event ev;
+        int sockfd = 0;
+
+        if (connections < 500000 && !isContinue) {
+            sockfd = socket(AF_INET, SOCK_STREAM, 0);
+            if (sockfd == -1) {
+                perror("socket");
+                goto err;
+            }
+
+            //ntySetReUseAddr(sockfd);
+            addr.sin_port = htons(port+index);
+
+            if (connect(sockfd, (struct sockaddr*)&addr, sizeof(struct sockaddr_in)) < 0) {
+                perror("connect");
+                goto err;
+            }
+            ntySetNonblock(sockfd);
+            ntySetReUseAddr(sockfd);
+
+            sprintf(buffer, "Hello Server: client --> %d\n", connections);
+            send(sockfd, buffer, strlen(buffer), 0);
+
+            ev.data.fd = sockfd;
+            ev.events = EPOLLIN | EPOLLOUT;
+            epoll_ctl(epoll_fd, EPOLL_CTL_ADD, sockfd, &ev);
+        
+            connections ++;
+        }
+        //connections ++;
+        if (connections % 1000 == 999 || connections >= 340000) {
+            struct timeval tv_cur;
+            memcpy(&tv_cur, &tv_begin, sizeof(struct timeval));
+            
+            gettimeofday(&tv_begin, NULL);
+
+            int time_used = TIME_SUB_MS(tv_begin, tv_cur);
+            printf("connections: %d, sockfd:%d, time_used:%d\n", connections, sockfd, time_used);
+
+            int nfds = epoll_wait(epoll_fd, events, connections, 100);
+            for (i = 0;i < nfds;i ++) {
+                int clientfd = events[i].data.fd;
+
+                if (events[i].events & EPOLLOUT) {
+                    sprintf(buffer, "data from %d\n", clientfd);
+                    send(sockfd, buffer, strlen(buffer), 0);
+                } else if (events[i].events & EPOLLIN) {
+                    char rBuffer[MAX_BUFFER] = {0};             
+                    ssize_t length = recv(sockfd, rBuffer, MAX_BUFFER, 0);
+                    if (length > 0) {
+                        printf(" RecvBuffer:%s\n", rBuffer);
+
+                        if (!strcmp(rBuffer, "quit")) {
+                            isContinue = 0;
+                        }
+                        
+                    } else if (length == 0) {
+                        printf(" Disconnect clientfd:%d\n", clientfd);
+                        connections --;
+                        close(clientfd);
+                    } else {
+                        if (errno == EINTR) continue;
+
+                        printf(" Error clientfd:%d, errno:%d\n", clientfd, errno);
+                        close(clientfd);
+                    }
+                } else {
+                    printf(" clientfd:%d, errno:%d\n", clientfd, errno);
+                    close(clientfd);
+                }
+            }
+        }
+
+        usleep(1 * 1000);
+    }
+
+    return 0;
+
+err:
+    printf("error : %s\n", strerror(errno));
+    return 0;
+    
+}
+
+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
+ + + diff --git a/blogs/acknowledge/gdbguide.html b/blogs/acknowledge/gdbguide.html new file mode 100644 index 0000000..a782921 --- /dev/null +++ b/blogs/acknowledge/gdbguide.html @@ -0,0 +1,507 @@ + + + + + + GDB调试手册 | 斯人如彩虹 + + + + + + + + + + + +

GDB调试手册

6/4/2022 知识

GDB调试手册

目录

0 用GDB调试程序

0.1 GDB概述

0.2 调试示例

0.2.1 源代码test1.c

0.2.2 调试过程

0.3 使用GDB

0.3.1 启动GDB

0.3.2 GDB环境中使用shell命令

0.3.3 在GDB中运行程序

1 设置断点

1.1 使用命令

1.2 示例

1.2.1 调试过程

2 程序的单步执行

2.1 使用命令

2.2 示例

2.2.1 调试过程

3 显示/修改变量的值

3.1使用命令

3.2示例

3.2.1 源代码test2.c

3.2.2 调试过程

4 监视程序变量值

4.1 使用命令

4.2 示例

4.2.1 调试过程

5 显示/修改寄存器

5.1 背景知识

5.2 使用命令

5.3 示例

5.2.1 调试过程

6 查看程序的堆栈

6.1 背景知识

6.2 使用命令

6.3 示例

6.3.1 源代码test3.c

6.3.2 调试过程

7 多线程调试

7.1 使用命令

7.2 示例

7.2.1 源代码test4.c

7.2.2 调试过程

8 死锁调试

8.1 使用命令

8.2 示例

8.2.1 源文件test5.c

8.2.2 调试过程

9 core文件调试

9.1 使用命令

9.2 示例

9.2.1 源代码test6.c

9.2.2 调试过程

# 0 用GDB调试程序

# 0.1 GDB概述

GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓“寸有所长,尺有所短”就是这个道理。

一般来说,GDB主要帮忙你完成下面四个方面的功能:

1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。

2、调试的程序在你所指定的断点处停住。(断点可以是条件表达式)

3、程序被停住时,可以检查此时你的程序中所发生的事。

4、动态的改变你程序的执行环境。

从上面看来,GDB和一般的调试工具没有什么两样,基本上也是完成这些功能,不过在细节上,你会发现GDB这个调试工具的强大,大家可能比较习惯了图形化的调试工具,但有时候,命令行的调试工具却有着图形化工具所不能完成的功能。让我们一一看来。

# 0.2 调试示例

# 0.2.1 源代码test1.c

1.#include <stdio.h>  
+2.  
+3.int func(int n)  
+4.{  
+5.    int sum=0,i;  
+6.    for(i=0; i<n; i++)  
+7.    {     
+8.        sum+=i;  
+9.    }     
+10.    return sum;  
+11.}  
+12.  
+13.  
+14.int main()  
+15.{  
+16.    int i = 0;  
+17.    int j = 0;  
+18.    int result = 0;  
+19.    int m = 0;  
+20.    int *p = &m;   
+21.    for(i=1; i<=3; i++)  
+22.    {     
+23.        result += i;  
+24.             
+25.        for(j=1; j < 6; j++)  
+26.        {     
+27.            m++;  
+28.        }     
+29.    }     
+30.  
+31.    printf("result[1-100] = %d \n", result );  
+32.    printf("result[1-250] = %d \n", func(250) );  
+33.  
+34.    return 0;  
+35.}  
+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

# 0.2.2 调试过程

编译生成执行文件:

root@luo:~/workspace/test/ exec\>gcc -g test1.c -o test1
+使用GDB调试:
+root@luo:~/workspace/test/exec\>gdb test1-------------- 启动GDB
+GNU gdb (Wind River Linux Sourcery CodeBench 4.8-45) 7.6
+Copyright (C) 2013 Free Software Foundation, Inc.
+License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
+This is free software: you are free to change and redistribute it.
+There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
+and "show warranty" for details.
+This GDB was configured as "x86_64-wrs-linux-gnu".
+For bug reporting instructions, please see:
+<support@windriver.com>...
+Reading symbols from /home/luo/workspace/test/exec/test1...done.
+(gdb) l 1-------------- 从第一行开始列出源码,l为list缩写
+1	#include <stdio.h>
+2	
+3	int func(int n)
+4	{
+5		int sum=0,i;
+6		for(i=0; i<n; i++)
+7		{
+8			sum+=i;
+9		}
+10		return sum;
+(gdb) -------------- 直接回车表示重复上一次命令
+11	}
+12	
+13	
+14	int main()
+15	{
+16		int i = 0;
+17		int j = 0;
+18		int result = 0;
+19		int m = 0;
+20		int *p = &m;
+(gdb) break 16 -------------- 设置断点,在源程序第16行
+Breakpoint 1 at 0x400566: file test1.c, line 16.
+(gdb) break func -------------- 设置断点,在func()函数入口处
+Breakpoint 2 at 0x400537: file test1.c, line 5.
+(gdb) info break -------------- 显示断点信息
+Num     Type           Disp Enb Address            What
+1       breakpoint     keep y   0x0000000000400566 in main at test1.c:16
+2       breakpoint     keep y   0x0000000000400537 in func at test1.c:5
+(gdb) r -------------- 运行程序,r为run简写
+Starting program: /home/luo/workspace/test/exec/test1 
+Breakpoint 1, main () at test1.c:16
+16		int i = 0;
+(gdb) n -------------- 单条语句执行,next命令简写
+17		int j = 0;
+(gdb) n
+18		int result = 0;
+(gdb) n
+19		int m = 0;
+(gdb) n
+20		int *p = &m;
+(gdb) c -------------- 继续运行程序,continue命令简写
+Continuing.
+result[1-100] = 6 -------------- 程序输出
+
+Breakpoint 2, func (n=250) at test1.c:5
+5		int sum=0,i;
+(gdb) n
+6		for(i=0; i<n; i++)
+(gdb) n
+8			sum+=i;
+(gdb) p i -------------- 打印变量i的值,p为print命令简写
+$1 = 0
+(gdb) n
+6		for(i=0; i<n; i++)
+(gdb) n
+8			sum+=i;
+(gdb) p sum
+$2 = 0
+(gdb) n
+6		for(i=0; i<n; i++)
+(gdb) p i
+$3 = 1
+(gdb) n
+8			sum+=i;
+(gdb) n
+6		for(i=0; i<n; i++)
+(gdb) p sum
+$4 = 3
+(gdb) bt -------------- 查看函数堆栈
+#0  func (n=250) at test1.c:6
+#1  0x00000000004005dd in main () at test1.c:32
+(gdb) finish -------------- 退出函数
+Run till exit from #0  func (n=250) at test1.c:6
+0x00000000004005dd in main () at test1.c:32
+32		printf("result[1-250] = %d \n", func(250) );
+Value returned is $5 = 31125
+(gdb) c -------------- 继续运行
+Continuing.
+result[1-250] = 31125 -------------- 程序输出
+[Inferior 1 (process 46602) exited normally] ------------ 程序退出,调试结束
+(gdb) q -------------- 退出GDB
+root@luo:~/workspace/test/exec\>
+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97

# 0.3 使用GDB

一般来说GDB主要调试的是C/C++的程序。要调试C/C++的程序,首先在编译时,我们必须要把调试信息加到可执行文件中。使用编译器(cc/gcc/g++)的 -g 参数可以做到这一点。如:

> cc -g hello.c -o hello

> g++ -g hello.cpp -o hello

如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。当你用-g把调试信息加入之后,并成功编译目标代码以后,让我们来看看如何用gdb来调试他。

# 0.3.1 启动GDB

启动GDB的方法有以下几种:

1、gdb <program>

program也就是你的执行文件,一般在当然目录下。

2、gdb <program> core

用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件。

3、gdb <program> <PID>

如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。gdb会自动attach上去,并调试他。program应该在PATH环境变量中搜索得到。

GDB启动时,可以加上一些GDB的启动开关,详细的开关可以用gdb -help查看。下面只例举一些比较常用的参数:

-symbols <file>

-s <file>

从指定文件中读取符号表。

-se file

指定文件中读取符号表信息,并把他用在可执行文件中。

-core <file>

-c <file>

调试时core dump的core文件。

-directory <directory>

-d <directory>

加入一个源文件的搜索路径。默认搜索路径是环境变量中PATH所定义的路径。

# 0.3.2 GDB环境中使用shell命令

在gdb环境中,你可以执行UNIX的shell的命令,使用gdb的shell命令来完成:

shell <command string>

调用UNIX的shell来执行<command string>,环境变量SHELL中定义的UNIX的shell将会被用来执行<command string>,如果SHELL没有定义,那就使用UNIX的标准shell:/bin/sh。(在Windows中使用Command.com或cmd.exe)

还有一个gdb命令是make:

make <make-args>

可以在gdb中执行make命令来重新build自己的程序。这个命令等价于“shell make <make-args>”。

# 0.3.3 在GDB中运行程序

当以gdb <program>方式启动gdb后,gdb会在PATH路径和当前目录中搜索<program>的源文件。如要确认gdb是否读到源文件,可使用l或list命令,看看gdb是否能列出源代码。

在gdb中,运行程序使用r或是run命令。程序的运行,你有可能需要设置下面四方面的事。

1、程序运行参数。

set args 可指定运行时参数。(如:set args 10 20 30 40 50)

show args 命令可以查看设置好的运行参数。

2、运行环境。

path <dir> 可设定程序的运行路径。

show paths 查看程序的运行路径。

set environment varname [=value] 设置环境变量。如:set env USER=aaa

show environment [varname] 查看环境变量。

3、工作目录。

cd <dir> 相当于shell的cd命令。

pwd 显示当前的所在目录。

4、程序的输入输出。

info terminal 显示你程序用到的终端的模式。

使用重定向控制程序输出。如:run > outfile

tty命令可以指写输入输出的终端设备。如:tty /dev/ttyb。

# 1 设置断点

# 1.1 使用命令

break linenum

在指定行号设置断点。

break function

在函数function的入口处设置断点。C++中可以使用class::function或function(type,type)格式来指定函数名。

break +offset/-offset

在当前行前面或后面offset行设置断点,offset为自然数。

break filename:linenum

在源文件filename的linenum行处设置断点。

break filename:function

在源文件filename的function函数的入口处设置断点。

break

break命令没有参数时,表示在下一条指令处设置断点。

break args if cond

设置一个带有条件cond的断点,只有条件为“真”时才停止。args代表上述参数之一。

delete [breakpoint num]

删除断点,breakpoint num为断点号。

tbreak args

设置仅停止一次的断点。args与上面break命令的相同。程序在该断点停止后,该断点便立即被删除。

# 1.2 示例

源代码test1.c 同上

# 1.2.1 调试过程

编译生成可执行文件,注意要带上 -g

root@luo:~/workspace/test/source\>gcc -g test.c -o ../exec/test

使用GDB调试:


+root@luo:~/workspace/test/source\>gcc -g test.c -o ../exec/test
+使用GDB调试:
+root@luo:~/workspace/test/exec\>gdb test 
+GNU gdb (Wind River Linux Sourcery CodeBench 4.8-45) 7.6
+Copyright (C) 2013 Free Software Foundation, Inc.
+License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
+This is free software: you are free to change and redistribute it.
+There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
+and "show warranty" for details.
+This GDB was configured as "x86_64-wrs-linux-gnu".
+For bug reporting instructions, please see:
+<support@windriver.com>...
+Reading symbols from /home/luo/workspace/test/exec/test...done.
+(gdb) l 1 -------------- l为list的简写,从第一行开始列出源码
+1	#include <stdio.h>
+2	
+3	int func(int n)
+4	{
+5		int sum=0,i;
+6		for(i=0; i<n; i++)
+7		{
+8			sum+=i;
+9		}
+10		return sum;
+(gdb) -------------- 直接回车,表示重复上一次命令
+11	}
+12	
+13	
+14	int main()
+15	{
+16		int i = 0;
+17		int j = 0;
+18		int result = 0;
+19		int m = 0;
+20		int *p = &m;
+(gdb) 
+21		for(i=1; i<=3; i++)
+22		{
+23			result += i;
+24	    
+25			for(j=1; j < 6; j++)
+26			{
+27				m++;
+28			}
+29		}
+30	
+(gdb) 
+31		printf("result[1-100] = %d \n", result );
+32		printf("result[1-250] = %d \n", func(250) );
+33	
+34		return 0;
+35	}
+(gdb) break main -------------- 设置断点,在函数main()入口处。
+Breakpoint 1 at 0x400566: file test.c, line 17.
+(gdb) break 21 -------------- 设置断点,在源程序第21行
+Breakpoint 2 at 0x400585: file test.c, line 21.
+(gdb) break test.c:func  -------------- 设置断点,在test.c文件的func()函数入口处
+Breakpoint 3 at 0x400537: file test.c, line 5.
+(gdb) r -------------- 运行程序,run命令简写
+Starting program: /home/luo/workspace/test/exec/test 
+
+Breakpoint 1, main () at test.c:17 ---------- 程序在main()入口停止
+17		int j = 0;
+(gdb) c -------------- 继续运行程序,continue命令的简写
+Continuing.
+
+Breakpoint 2, main () at test.c:22 -------------- 程序在22行停止
+22		{
+(gdb) tbreak 26  -------------- 设置临时断点,在26行
+Temporary breakpoint 4 at 0x400594: file test.c, line 26.
+(gdb) info b -------------- 查看断点信息
+Num     Type           Disp Enb Address            What
+1       breakpoint     keep y   0x0000000000400566 in main at test.c:17
+	breakpoint already hit 1 time
+2       breakpoint     keep y   0x0000000000400585 in main at test.c:21
+	breakpoint already hit 1 time
+3       breakpoint     keep y   0x0000000000400537 in func at test.c:5
+4       breakpoint     del  y   0x0000000000400594 in main at test.c:26
+(gdb) c -------------- 继续运行程序
+Continuing.
+
+Temporary breakpoint 4, main () at test.c:26  --------------程序在26行停止
+26			{
+(gdb) info b -------------- 再查看断点信息,临时断点已删除
+Num     Type           Disp Enb Address            What
+1       breakpoint     keep y   0x0000000000400566 in main at test.c:17
+	breakpoint already hit 1 time
+2       breakpoint     keep y   0x0000000000400585 in main at test.c:21
+	breakpoint already hit 1 time
+3       breakpoint     keep y   0x0000000000400537 in func at test.c:5
+(gdb) break 27 if m = 10 ------------ 设置断点,在27行,当m=10时生效
+Breakpoint 5 at 0x4005b1: file test.c, line 27.
+(gdb) c -------------- 继续运行程序
+Continuing.
+
+Breakpoint 2, main () at test.c:22 ------------ 程序在22行停止
+22		{
+(gdb) c -------------- 继续运行程序
+Continuing.
+
+Breakpoint 2, main () at test.c:22
+22		{
+(gdb) c -------------- 继续运行程序
+Continuing.
+
+Breakpoint 5, main () at test.c:30 -------------- 程序在30行停止
+30
+(gdb) print "%d", m -------------- 打印m的值
+$1 = 10 -------------- 此时m = 10
+(gdb) c -------------- 继续运行程序
+Continuing.
+result[1-100] = 6 
+
+Breakpoint 3, func (n=250) at test.c:5 ---------- 程序在func()函数入口处停止
+5		int sum=0,i;
+(gdb) tbreak +3 -------------- 在当前行+3行处设置临时断点
+Temporary breakpoint 8 at 0x400547: file test.c, line 8.
+(gdb) c -------------- 继续运行程序
+Continuing.
+Temporary breakpoint 8, func (n=250) at test.c:8
+8			sum+=i;
+(gdb) break -------------- 在下一条指令处设置断点
+Breakpoint 9 at 0x400547: file test.c, line 8.
+(gdb) c -------------- 继续运行程序
+Continuing.
+Breakpoint 9, func (n=250) at test.c:8 -------------- 在第8行停止
+8			sum+=i;
+(gdb) c -------------- 继续运行程序
+Continuing.
+Breakpoint 9, func (n=250) at test.c:8 -------------- 在第8行停止
+8			sum+=i;
+(gdb) clear --------------清楚所有断点
+Deleted breakpoint 9 
+(gdb) c -------------- 继续运行程序
+Continuing.
+result[1-250] = 31125 
+(gdb)
+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138

# 2 程序的单步执行

# 2.1 使用命令

step <count>

单步跟踪,如果有函数调用,他会进入该函数。进入函数的前提是,此函数被编译有debug信息。后面可以加count也可以不加,不加表示一条条地执行,加表示执行后面的count条指令,然后再停住。

next <count>

同样单步跟踪,如果有函数调用,他不会进入该函数。后面可以加count也可以不加,不加表示一条条地执行,加表示执行后面的count条指令,然后再停住。

finish

运行程序,直到当前函数完成返回。并打印函数返回时的堆栈地址和返回值及参数值等信息。

until 或 u

当你厌倦了在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体。

# 2.2 示例

源代码test1.c 同上

# 2.2.1 调试过程

root@luo:~/workspace/test/exec\>gdb -q test 
+----- 启动GDB,-q使启动使版本信息不显示
+Reading symbols from /home/luo/workspace/test/exec/test...done.
+(gdb) break 18 -------------- 在第18行设置断点
+Breakpoint 1 at 0x400574: file test.c, line 18.
+(gdb) r -------------- 运行程序
+Starting program: /home/luo/workspace/test/exec/test 
+
+Breakpoint 1, main () at test.c:18 -------------- 在18行停止
+18		int result = 0;
+(gdb) n -------------- 下一条
+19		int m = 0;
+(gdb) n -------------- 下一条
+20		int *p = &m;
+(gdb) s -------------- 下一条
+21		for(i=1; i<=3; i++)
+(gdb) s -------------- 下一条
+23			result += i;
+(gdb) n -------------- 下一条
+25			for(j=1; j < 6; j++)
+(gdb) n -------------- 下一条 
+27				m++;
+(gdb) u -------------- 运行函数到退出当前循环
+25			for(j=1; j < 6; j++)
+(gdb) u -------------- 运行程序到退出当前循环
+21		for(i=1; i<=3; i++)
+(gdb) u -------------- 运行程序到退出当前循环
+31		printf("result[1-100] = %d \n", result );
+(gdb) s -------------- 下一条
+result[1-100] = 6 
+32		printf("result[1-250] = %d \n", func(250) );
+(gdb) s -------------- step下一条
+func (n=250) at test.c:5 -------------- 进入函数func()
+5		int sum=0,i;
+(gdb) finish -------------- 运行程序到函数完成
+Run till exit from #0  func (n=250) at test.c:5
+0x00000000004005dd in main () at test.c:32
+32		printf("result[1-250] = %d \n", func(250) );
+Value returned is $1 = 31125
+(gdb) r -------------- 再次运行程序
+The program being debugged has been started already.
+Start it from the beginning? (y or n) y
+Starting program: /home/luo/workspace/test/exec/test 
+Breakpoint 1, main () at test.c:18 -------------- 程序在18行停止
+18		int result = 0;
+(gdb) break 30 -------------- 设置断点,在30行
+Breakpoint 2 at 0x4005bf: file test.c, line 30.
+(gdb) c -------------- 继续运行程序
+Continuing.
+Breakpoint 2, main () at test.c:31 -------------- 程序在31行停止
+31		printf("result[1-100] = %d \n", result );
+(gdb) n -------------- next下一条
+result[1-100] = 6 
+32		printf("result[1-250] = %d \n", func(250) );
+(gdb) n -------------- next下一条
+result[1-250] = 31125  -------------- 未进入函数func()
+34		return 0;
+(gdb)
+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58

# 3 显示/修改变量的值

# 3.1使用命令

print <expr>

print /<f> <expr>

当程序被停住时,可以使用print命令(简写为p),或同义命令inspect来查看当前程序的运行数据。<expr>是表达式,是你所调试的程序的语言的表达式(GDB可以调试多种编程语言),<f>是输出的格式,比如,如果要把表达式按16进制的格式输出,那么就是/x。

注意:GDB中,变量分为全局变量、静态全局变量、局部变量三种,当局部变量与全局变量发生重名时,用pirnt显示出的变量的值会是函数中的局部变量的值。此时如果要查看全局变量的值,可以使用“::”操作符:

file::variable

function::variable

可以通过这种形式查看某个文件或是某个函数的变量。

# 3.2示例

# 3.2.1 源代码test2.c

1.#include <stdio.h>  
+2.  
+3.int func(int m){   
+4.    int n = 0;  
+5.    int i = 0;  
+6.    for(i = 0; i < m; i++){  
+7.        n += m;  
+8.    }     
+9.  
+10.    return n;  
+11.
+12.}  
+13.  
+14.int main(){  
+15.    int i = 0;  
+16.    int b = 0;  
+17.    int n = 20;   
+18.    int sum = 0;  
+19.    sum = func(40);  
+20.    for(i = 0; i < 10; i++){  
+21.        n++;  
+22.    }     
+23.  
+24.    return 0;  
+}  
+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

# 3.2.2 调试过程

编译生成可执行文件:

root@luo:~/workspace/test/source\>gcc -g test2.c -o ../exec/test2

启动GDB:


+root@luo:~/workspace/test/source\>gcc -g test2.c -o ../exec/test2
+启动GDB:
+root@luo:~/workspace/test/exec\>gdb -q test2
+Reading symbols from /home/luo/workspace/test/exec/test2...done.
+(gdb) l 1
+1	#include <stdio.h>
+2	
+3	int func(int m){
+4		int n = 0;
+5		int i = 0;
+6		for(i = 0; i < m; i++){
+7			n += m;
+8		}
+9	
+10		return n;
+(gdb) 
+11	
+12	}
+13	
+14	int main(){
+15		int i = 0;
+16		int b = 0;
+17		int n = 20;
+18		int sum = 0;
+19		sum = func(40);
+20		for(i = 0; i < 10; i++){
+(gdb) 
+21			n++;
+22		}
+23	
+24		return 0;
+25	}
+(gdb) break func -------------- 设置断点,在func()函数入口处
+Breakpoint 1 at 0x4004f7: file test2.c, line 4.
+(gdb) break 21 -------------- 设置断点,在21行
+Breakpoint 2 at 0x40055f: file test2.c, line 21.
+(gdb) r -------------- 运行程序
+Starting program: /home/luo/workspace/test/exec/test2 
+
+Breakpoint 1, func (m=40) at test2.c:4
+4		int n = 0;
+(gdb) p n -------------- 在func()函数内,显示变量n的值
+$1 = 0
+(gdb) p main::n ------------ 在func()内,显示main()函数中n的值
+$2 = 20 
+(gdb) c -------------- 继续运行程序
+Continuing.
+
+Breakpoint 2, main () at test2.c:21
+21			n++;
+(gdb) p n -------------- 显示n的值
+$3 = 20
+(gdb) p n = 50 -------------- 修改n的值为50
+$4 = 50
+(gdb) p n -------------- 显示n的值
+$5 = 50
+(gdb) c -------------- 继续运行程序
+Continuing.
+
+Breakpoint 2, main () at test2.c:21
+21			n++;
+(gdb) p n ------------ 显示n的值,可以看到,n在修改基础上加1
+$6 = 51
+(gdb) p /x n ------------ 用16进制显示n值
+$7 = 0x33 
+(gdb)
+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67

# 4 监视程序变量值

# 4.1 使用命令

display <expr>

display/<fmt> <expr>

display/<fmt> <addr>

display命令可以设置一些自动显示的变量,当程序停住时,或是在单步跟踪时,这些变量会自动显示。expr是一个表达式,fmt表示显示的格式,addr表示内存地址,当用display设定好了一个或多个表达式后,只要程序被停下来,GDB会自动显示你所设置的这些表达式的值。

undisplay <dnums...>

delete display <dnums...>

删除自动显示,dnums意为所设置好了的自动显式的编号。如果要同时删除几个,编号可以用空格分隔,如果要删除一个范围内的编号,可以用减号表示(如:2-5)。

disable display <dnums...>

enable display <dnums...>

disable和enalbe不删除自动显示的设置,而只是让其失效和恢复。

info display

查看display设置的自动显示的信息,包括设置的编号,表达式,是否enable。

# 4.2 示例

源代码test2.c同上

# 4.2.1 调试过程

启动GDB:

root@luo:~/workspace/test/exec\>gdb -q test2

Reading symbols from /home/luo/workspace/test/exec/test2...done.

(gdb) l 1 -------------- 列出源代码

1 #include <stdio.h>

2

3 int func(int m){

4 int n = 0;

5 int i = 0;

6 for(i = 0; i < m; i++){

7 n += m;

8 }

9

10 return n;

(gdb)

11

12 }

13

14 int main(){

15 int i = 0;

16 int b = 0;

17 int n = 20;

18 int sum = 0;

19 sum = func(40);

20 for(i = 0; i < 10; i++){

(gdb)

21 n++;

22 }

23

24 return 0;

25 }

(gdb) break 21 -------------- 设置断点,在21行

Breakpoint 1 at 0x40055f: file test2.c, line 21.

(gdb) r -------------- 运行程序

Starting program: /home/luo/workspace/test/exec/test2

Breakpoint 1, main () at test2.c:21

21 n++;

(gdb) display n -------------- 跟踪变量n的值

1: n = 20

(gdb) display i -------------- 跟踪变量i的值

2: i = 0

(gdb) display n+i -------------- 跟踪n+i的值

3: n+i = 20

(gdb) display/x n -------------- 跟踪n的值,以16进制显示

4: /x n = 0x14

(gdb) display &n -------------- 跟踪n的地址

5: &n = (int *) 0x7fffffffe0a8

(gdb) c -------------- 继续运行程序

Continuing.

Breakpoint 1, main () at test2.c:21

21 n++;

5: &n = (int *) 0x7fffffffe0a8

4: /x n = 0x15

3: n+i = 22

2: i = 1

1: n = 21

(gdb) delete display 4 -------------- 删除4号跟踪

(gdb) c -------------- 继续运行程序

Continuing.

Breakpoint 1, main () at test2.c:21 ------------ 可以看到,4号没了

21 n++;

5: &n = (int *) 0x7fffffffe0a8

3: n+i = 24

2: i = 2

1: n = 22

(gdb) disable display 5 -------------- 使5号跟踪失效

(gdb) c -------------- 继续运行程序

Continuing.

Breakpoint 1, main () at test2.c:21 ------- 可以看到,5号也没显示

21 n++;

3: n+i = 26

2: i = 3

1: n = 23

(gdb) enable display 5 -------------- 使5号跟踪恢复

(gdb) c -------------- 继续运行程序

Continuing.

Breakpoint 1, main () at test2.c:21 ------ 可以看到,5号再次显示

21 n++;

5: &n = (int *) 0x7fffffffe0a8

3: n+i = 28

2: i = 4

1: n = 24

(gdb) info display -------------- 查看自动显示信息

Auto-display expressions now in effect:

Num Enb Expression

5: y &n

3: y n+i

2: y i

1: y n

(gdb) disable display 1 2 3 ----------- 使1,2,3号都失效

(gdb) c -------------- 继续运行程序

Continuing.

Breakpoint 1, main () at test2.c:21

21 n++;

5: &n = (int *) 0x7fffffffe0a8

(gdb) info display -------------- 查看自动显示信息

Auto-display expressions now in effect:

Num Enb Expression

5: y &n

3: n n+i

2: n i

1: n n

(gdb)

# 5 显示/修改寄存器

# 5.1 背景知识

先明确一点,这里指的是通用寄存器(后简称寄存器)。既然是通用的,使用并没有限制;后面介绍寄存器使用规则或者惯例,只是GCC/G++的规则。因为我们想对GCC编译的C/C++序进行分析,所以了解这些规则就很有帮助。

在体系结构教科书中,寄存器通常被说成寄存器文件,其实就是CPU上的一块存储区域,不过更喜欢使用标识符来表示,而不是地址而已。

X86-64中,所有寄存器都是64位,相对32位的x86来说,标识符发生了变化,比如:从原来的%ebp变成了%rbp。为了向后兼容性,%ebp依然可以使用,不过指向了%rbp的低32位。

X86-64寄存器的变化,不仅体现在位数上,更加体现在寄存器数量上。新增加寄存器%r8到%r15。加上x86的原有8个,一共16个寄存器。

刚刚说到,寄存器集成在CPU上,存取速度比存储器快好几个数量级,寄存器多了,GCC就可以更多的使用寄存器,替换之前的存储器堆栈使用,从而大大提升性能。

让寄存器为己所用,就得了解它们的用途,这些用途都涉及函数调用,X86-64有16个64位寄存器,分别是:

%rax,%rbx,%rcx,%rdx,%rsi,%rdi,%rbp,%rsp,%r8,%r9,%r10,%r11,%r12,%r13,%r14,%r15。

其中:

%rax 作为函数返回值使用。

%rsp 栈指针寄存器,指向栈顶。

%rdi,%rsi,%rdx,%rcx,%r8,%r9 用作函数参数,依次对应第1参数,第2参数…

%rbx,%rbp,%r12,%r13,%14,%15 用作数据存储,遵循被调用者使用规则,简单说就是随便用,调用子函数之前要备份它,以防他被修改。

%r10,%r11 用作数据存储,遵循调用者使用规则,简单说就是使用之前要先保存原值。

# 5.2 使用命令

info registers

查看寄存器的情况。(不包括浮点寄存器)

info all-registers

查看所有寄存器的情况。(包括浮点寄存器)

info registers <regname …>

查看所指定的寄存器的情况。

set $<regname>=<value>

修改寄存器的值。

# 5.3 示例

源代码test2.c同上

# 5.2.1 调试过程

启动GDB:

root@luo:~/workspace/test/exec\>gdb -q test2

Reading symbols from /home/luo/workspace/test/exec/test2...done.

(gdb) b main -------------- 在main函数设置断点

Breakpoint 1 at 0x40052d: file test2.c, line 15.

(gdb) r -------------- 运行程序

Starting program: /home/luo/workspace/test/exec/test2

Breakpoint 1, main () at test2.c:15

15 int i = 0;

(gdb) s -------------- step单步执行

16 int b = 0;

(gdb)

17 int n = 20;

(gdb)

18 int sum = 0;

(gdb)

19 sum = func(40);

(gdb)

func (m=40) at test2.c:4 -------------- 进入*func()*函数了

4 int n = 0;

(gdb) i all-r -------------- 显示所有寄存器信息

rax 0x400525 4195621

rbx 0x0 0

rcx 0x0 0

rdx 0x7fffffffe1a8 140737488347560

rsi 0x7fffffffe198 140737488347544

rdi 0x28 40

rbp 0x7fffffffe090 0x7fffffffe090

rsp 0x7fffffffe090 0x7fffffffe090

r8 0x30555a3c60 207590407264

r9 0x305360ec80 207557291136

r10 0x7fffffffdf40 140737488346944

r11 0x3055221b00 207586728704

r12 0x4003b0 4195248

r13 0x7fffffffe190 140737488347536

r14 0x0 0

r15 0x0 0

rip 0x4004f7 0x4004f7 <func+7>

eflags 0x206 [ PF IF ]

cs 0x33 51

ss 0x2b 43

ds 0x0 0

es 0x0 0

fs 0x0 0

gs 0x0 0

st0 0 (raw 0x00000000000000000000)

st1 0 (raw 0x00000000000000000000)

---Type <return> to continue, or q <return> to quit---q

Quit -------------- 退出显示

(gdb) i r -------------- 显示寄存器信息,不包括浮点寄存器

rax 0x400525 4195621

rbx 0x0 0

rcx 0x0 0

rdx 0x7fffffffe1a8 140737488347560

rsi 0x7fffffffe198 140737488347544

rdi 0x28 40

rbp 0x7fffffffe090 0x7fffffffe090

rsp 0x7fffffffe090 0x7fffffffe090

r8 0x30555a3c60 207590407264

r9 0x305360ec80 207557291136

r10 0x7fffffffdf40 140737488346944

r11 0x3055221b00 207586728704

r12 0x4003b0 4195248

r13 0x7fffffffe190 140737488347536

r14 0x0 0

r15 0x0 0

rip 0x4004f7 0x4004f7 <func+7>

eflags 0x206 [ PF IF ]

cs 0x33 51

ss 0x2b 43

ds 0x0 0

es 0x0 0

fs 0x0 0

gs 0x0 0

(gdb) info registers rax -------------- 查看指定寄存器的信息

rax 0x400525 4195621

(gdb) n -------------- 单步执行

5 int i = 0;

(gdb)

6 for(i = 0; i < m; i++){

(gdb)

7 n += m;

(gdb) u -------------- 执行直至循环结束

6 for(i = 0; i < m; i++){

(gdb)

10 return n;

(gdb) i r rax -------------- 查看指定寄存器rax信息,其存放函数返回值

rax 0x28 40

(gdb) n -------------- 单步执行,此时已经return

12 }

(gdb) i r rax -------------- 查看rax信息,为1600

rax 0x640 1600

(gdb) set $rax=99 --------------rax值修改为99

(gdb) i r rax -------------- 再查看rax,为99

rax 0x63 99

(gdb) n -------------- 单步执行,此时已经退出函数

main () at test2.c:20

20 for(i = 0; i < 10; i++){

(gdb) p sum ----------- 显示sum值,其值应为刚刚*func()*函数的返回值

$1 = 99 ----------- 正确

(gdb)

# 6 查看程序的堆栈

# 6.1 背景知识

当你的程序到暂停到断点处时,你需要知道的第一件事就是知道程序停在哪儿,以及通过什么样的函数调用关系到达这里的。

每当你的程序调用一个函数,这个函数的相关信息将会生成,该信息包括这个函数在程序中的位置,函数的参数,以及被调用的局部变量的值。这些信息保存在一个数据块中,这个数据块叫做栈框。这些栈框位于内存中称为栈的区域。

当你的程序断点处停止,GDB查看堆栈的命令允许你看到所有函数相关的信息。

栈被划分为多个连续的块,每个块称为栈框;每个栈框都存有与调用函数相关的数据。栈框中包含了调用函数的参数,调用函数的局部变量。以及这个函数的执行的地址。

当程序开始执行时,栈上就只有一个栈框,也就是用来描述Main函数的。这个栈框称为初始化栈框或最外层栈框。每当调用一个函数,一个新的栈框将会生成。每当一个函数结束,该函数对应的栈框将会消除。如果一个函数是递归函数,这将会对同一个函数产生很多个栈框。正在执行函数的栈框将叫做最内层栈框。这个是所有存在栈框中最新创建的。在你的程序里,栈框通过它对应到的地址进行标识。一个栈框由多个字节组成,每个栈框都有自己的地址,当程序执行到这个栈框时。通常这个栈框地址存放在特定的寄存器中。

gdb为每个存在的栈框赋上一个标号。标号从0开始,0表示最里层的栈框。也就是正在被调用函数的栈框。这些标号在程序中并不存在,它是由gdb赋予的,gdb通过赋予这个标号来给gdb的命令指定哪个栈框。

# 6.2 使用命令

frame args

这个frame命令允许你从一个栈框移动到另一个栈框,然后可以打印出你选择的栈框,args要么是栈框的地址,要么是栈框的标号,如果没有参数,frame命令将会打印出当前的栈框。

select -frame

select -frame命令允许你从一个栈框移动到另外一个栈框而不打印栈框的信息,这个命令可以看作是frame命令的silent版本。

backtrace

bt

bt命令打印栈全部的backtrace,每个栈框显示一行。你可以在任何时间结束backtrace通过键入系统中断字符,ctrl+c。

backtrace n

bt n

bt n 命令将会显示最内层的n个栈框。

backtrace -n

bt -n

bt -n将会显示最外层的n个栈框。

backtrace full

bt full

bt full n

bt full -n

如果添加full这个参数的话,将会显示栈框中的局部变量。

frame n

f n

frame n(f n)将会选择栈框n,栈框0是最内层的栈框,也就是当前执行的函数,栈框1是调用最内层栈框的函数。最大的栈框就是main函数对应的栈框。

frame addr

f addr

通过栈框的地址选择栈框。如果栈框被bug破坏掉了,这将是主要的方法去查看栈框。栈框破坏掉了,gdb将不能通过栈框标号去定位栈框。另外,如果你的程序有多个栈,在多个栈切换时这中方法将很有用。

up n

up n将会朝外层栈框走n个。它的方向是朝最外层的栈框,也就是最大的栈框号。

down n

down n和up n是对应的,它将会朝最内层走n个栈框。

这些命令将会打印两行关于该栈框的信息,第一行将会显示栈框号,函数名,参数,以及源代码所在的文件名,和所在的行。

# 6.3 示例

# 6.3.1 源代码test3.c

  1. #include <stdio.h>
  2. int func4(int m)
  3. {
  4. int ret = m - m / 2;
  5. return ret;
  6. }
  7. int func3(int m)
  8. {
  9. int ret = m + func4(m);
  10. return ret;
  11. }
  12. int func2(int m)
  13. {
  14. int ret = m * func3(m);
  15. return ret;
  16. }
  17. int func1(int m)
  18. {
  19. int ret = func2(m) + 1;
  20. return ret;
  21. }
  22. int main()
  23. {
  24. int m = 40;
  25. int n = func1(m);
  26. return 0;
  27. }

# 6.3.2 调试过程

启动GDB:

root@luo:~/workspace/test/exec\>gdb -q test3

Reading symbols from /home/luo/workspace/test/exec/test3...done.

(gdb) b main -------------- 在main函数设置断点

Breakpoint 1 at 0x40057d: file ../source/test3.c, line 30.

(gdb) r -------------- 运行程序

Starting program: /home/luo/workspace/test/exec/test3

Breakpoint 1, main () at ../source/test3.c:30

30 int m = 40;

(gdb) s -------------- step单步执行

31 int n = func1(m);

(gdb) s

func1 (m=40) at ../source/test3.c:24

24 int ret = func2(m) + 1;

(gdb) s

func2 (m=40) at ../source/test3.c:18

18 int ret = m * func3(m);

(gdb) s

func3 (m=40) at ../source/test3.c:11

11 int ret = m + func4(m);

(gdb) s

func4 (m=40) at ../source/test3.c:5

5 int ret = m - m / 2;

(gdb) bt -------------- 显示栈信息

#0 func4 (m=40) at ../source/test3.c:5

#1 0x0000000000400527 in func3 (m=40) at ../source/test3.c:11

#2 0x0000000000400549 in func2 (m=40) at ../source/test3.c:18

#3 0x000000000040056a in func1 (m=40) at ../source/test3.c:24

#4 0x000000000040058e in main () at ../source/test3.c:31

(gdb) frame 2 -------------- 跳到标号为2的栈框

#2 0x0000000000400549 in func2 (m=40) at ../source/test3.c:18

18 int ret = m * func3(m);

(gdb) select-frame 2 ------------- 跳到标号为2的栈框并且不打印信息

(gdb) bt 3 -------------- 显示最内层的3个栈框

#0 func4 (m=40) at ../source/test3.c:5

#1 0x0000000000400527 in func3 (m=40) at ../source/test3.c:11

#2 0x0000000000400549 in func2 (m=40) at ../source/test3.c:18

(More stack frames follow...)

(gdb) bt -3 -------------- 显示最外层的3个栈框

#2 0x0000000000400549 in func2 (m=40) at ../source/test3.c:18

#3 0x000000000040056a in func1 (m=40) at ../source/test3.c:24

#4 0x000000000040058e in main () at ../source/test3.c:31

(gdb) bt full -------------- 显示栈信息,包括局部变量

#0 func4 (m=40) at ../source/test3.c:5

ret = 0

#1 0x0000000000400527 in func3 (m=40) at ../source/test3.c:11

ret = 0

#2 0x0000000000400549 in func2 (m=40) at ../source/test3.c:18

ret = 0

#3 0x000000000040056a in func1 (m=40) at ../source/test3.c:24

ret = 0

#4 0x000000000040058e in main () at ../source/test3.c:31

m = 40

n = 0

(gdb) frame 2 -------------- 移动到标号为2的栈框

#2 0x0000000000400549 in func2 (m=40) at ../source/test3.c:18

18 int ret = m * func3(m);

(gdb) bt

#0 func4 (m=40) at ../source/test3.c:5

#1 0x0000000000400527 in func3 (m=40) at ../source/test3.c:11

#2 0x0000000000400549 in func2 (m=40) at ../source/test3.c:18

#3 0x000000000040056a in func1 (m=40) at ../source/test3.c:24

#4 0x000000000040058e in main () at ../source/test3.c:31

(gdb) up 2 -------------- 向外层栈框移动2层

#4 0x000000000040058e in main () at ../source/test3.c:31

31 int n = func1(m);

(gdb) down 3 -------------- 向内层栈框移动3层

#1 0x0000000000400527 in func3 (m=40) at ../source/test3.c:11

11 int ret = m + func4(m);

(gdb)

# 7 多线程调试

# 7.1 使用命令

info threads

查看当前进程的线程。GDB会为每个线程分配一个ID, 后面操作线程的时候会用到这个ID。前面有*的是当前调试的线程。

thread <ID>

切换调试的线程为指定ID的线程。

break file.c:number thread all

在file.c文件第number行处为所有经过这里的线程设置断点。

set scheduler-locking off|on|step

在使用step或者continue命令调试当前被调试线程的时候,其他线程也是同时执行的, 怎么只让被调试程序执行呢?

通过这个命令就可以实现这个需求。

off 不锁定任何线程,也就是所有线程都执行,这是默认值。

on 只有当前被调试程序会执行。

step 在单步的时候,除了next过一个函数的情况 (熟悉情况的人可能知道,这其实是一个设置断点然后continue的行为)以外,只有当前线程会执行。

thread apply ID1 ID2 command

让一个或多个线程执行GDB命令command。

thread apply all command

让所有被调试线程执行GDB命令command。

# 7.2 示例

# 7.2.1 源代码test4.c

  1. /*
  2. * 本文件为多线程调试测试准备
  3. */
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <pthread.h>
  7. #include <unistd.h>
  8. void func1()
  9. {
  10. int i = 0;
  11. while(1){
  12. i++;
  13. printf("**********************************\n");
  14. printf("this is function 1!\n");
  15. printf("this is %d time!\n", i);
  16. sleep(1);
  17. }
  18. return ;
  19. }
  20. void func2()
  21. {
  22. int i = 0;
  23. while(1){
  24. i++;
  25. printf("**********************************\n");
  26. printf("this is function 2!\n");
  27. printf("this is %d time!\n", i);
  28. sleep(1);
  29. }
  30. return ;
  31. }
  32. int main()
  33. {
  34. pthread_t td1, td2, td3;
  35. int ret_td1, ret_td2, ret_td3;
  36. ret_td1 = pthread_create(&td1, NULL, (void*)&func1, NULL);
  37. ret_td2 = pthread_create(&td2, NULL, (void*)&func2, NULL);
  38. ret_td3 = pthread_create(&td3, NULL, (void*)&func2, NULL);
  39. if(ret_td1 != 0){
  40. printf("线程1创建失败\n");
  41. }else{
  42. printf("线程1创建成功\n");
  43. }
  44. if(ret_td2 != 0){
  45. printf("线程2创建失败\n");
  46. }else{
  47. printf("线程2创建成功\n");
  48. }
  49. if(ret_td3 != 0){
  50. printf("线程3创建失败\n");
  51. }else{
  52. printf("线程3创建成功\n");
  53. }
  54. return 0;
  55. }

# 7.2.2 调试过程

编译生成可执行文件,注意带上 -lpthread

root@luo:~/workspace/test/exec\>gcc -g ../source/test4.c -o test4 -lpthread

启动GDB:

root@luo:~/workspace/test/exec\>gdb -q test4

Reading symbols from /home/luo/workspace/test/exec/test4...done.

(gdb) b main -------------- 在main()函数设置断点

Breakpoint 1 at 0x400776: file ../source/test4.c, line 42.

(gdb) l 1 -------------- 列出源代码

1 /*

2 * 本文件为多线程调试测试准备

3 */

4 #include <stdio.h>

5 #include <stdlib.h>

6 #include <pthread.h>

7 #include <unistd.h>

8

9 void func1()

10 {

(gdb)

11 int i = 0;

12 while(1){

13 i++;

14 printf("**********************************\n");

15 printf("this is function 1!\n");

16 printf("this is %d time!\n", i);

17 sleep(1);

18 }

19

20 return ;

(gdb)

21 }

22

23 void func2()

24 {

25 int i = 0;

26 while(1){

27 i++;

28 printf("**********************************\n");

29 printf("this is function 2!\n");

30 printf("this is %d time!\n", i);

(gdb)

31 sleep(1);

32 }

33 return ;

34 }

35

36

37 int main()

38 {

39 pthread_t td1, td2, td3;

40 int ret_td1, ret_td2, ret_td3;

(gdb)

41

42 ret_td1 = pthread_create(&td1, NULL, (void*)&func1, NULL);

43 ret_td2 = pthread_create(&td2, NULL, (void*)&func2, NULL);

44 ret_td3 = pthread_create(&td3, NULL, (void*)&func2, NULL);

45

46 if(ret_td1 != 0){

47 printf("线程1创建失败\n");

48 }else{

49 printf("线程1创建成功\n");

50 }

(gdb)

51

52 if(ret_td2 != 0){

53 printf("线程2创建失败\n");

54 }else{

55 printf("线程2创建成功\n");

56 }

57

58 if(ret_td3 != 0){

59 printf("线程3创建失败\n");

60 }else{

(gdb)

61 printf("线程3创建成功\n");

62 }

63

64 return 0;

65 }

(gdb) b 18 -------------- 在18行设置断点

Breakpoint 2 at 0x400725: file ../source/test4.c, line 18.

(gdb) b 32 -------------- 在32行设置断点

Breakpoint 3 at 0x40076c: file ../source/test4.c, line 32.

(gdb) b 46 -------------- 在46行设置断点

Breakpoint 4 at 0x4007d0: file ../source/test4.c, line 46.

(gdb) r -------------- 运行程序

Starting program: /home/luo/workspace/test/exec/test4

[Thread debugging using libthread_db enabled]

Using host libthread_db library "/lib64/libthread_db.so.1".

Breakpoint 1, main () at ../source/test4.c:42

42 ret_td1 = pthread_create(&td1, NULL, (void*)&func1, NULL);

(gdb) info threads -------------- 查看线程信息,目前只有一个主线程

Id Target Id Frame

* 1 Thread 0x7ffff7dd2700 (LWP 40907) "test4" main ()

at ../source/test4.c:42

(gdb) c -------------- 继续运行程序

Continuing.

[New Thread 0x7ffff7dd0700 (LWP 40913)] -------------- 新线程创建

**********************************

[New Thread 0x7ffff75cf700 (LWP 40914)] -------------- 新线程创建

this is function 1!

this is 1 time!

[New Thread 0x7ffff6dce700 (LWP 40915)] -------------- 新线程创建

**********************************

Breakpoint 4, main () at ../source/test4.c:46

46 if(ret_td1 != 0){

(gdb) info threads -------------- 查看线程信息

Id Target Id Frame

4 Thread 0x7ffff6dce700 (LWP 40915) "test4" 0x00000030552d795d in write () from /lib64/libc.so.6

3 Thread 0x7ffff75cf700 (LWP 40914) "test4" __lll_lock_wait_private ()

at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:95

2 Thread 0x7ffff7dd0700 (LWP 40913) "test4" 0x00000030552b5a0d in nanosleep () from /lib64/libc.so.6

* 1 Thread 0x7ffff7dd2700 (LWP 40907) "test4" main ()

at ../source/test4.c:46

(gdb) set scheduler-locking on -------------- 设置调试模式为只有当前线程会被执行

(gdb) thread 4 -------------- 切换到4号线程

[Switching to thread 4 (Thread 0x7ffff6dce700 (LWP 40915))]

#0 0x00000030552d795d in write () from /lib64/libc.so.6

(gdb) c -------------- 当前线程执行continue

Continuing.

this is function 2!

this is 1 time!

Breakpoint 3, func2 () at ../source/test4.c:32

32 }

(gdb) c

Continuing.

**********************************

this is function 2!

this is 2 time!

Breakpoint 3, func2 () at ../source/test4.c:32

32 }

(gdb) thread 3 -------------- 切换线程

[Switching to thread 3 (Thread 0x7ffff75cf700 (LWP 40914))]

#0 __lll_lock_wait_private ()

at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:95

95 ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S: No such file or directory.

(gdb) c

Continuing.

**********************************

this is function 2!

this is 1 time!

Breakpoint 3, func2 () at ../source/test4.c:32

32 }

(gdb) c

Continuing.

**********************************

this is function 2!

this is 2 time!

Breakpoint 3, func2 () at ../source/test4.c:32

32 }

(gdb) thread 2 -------------- 切换线程

[Switching to thread 2 (Thread 0x7ffff7dd0700 (LWP 40913))]

#0 0x00000030552f081b in ?? () from /lib64/libc.so.6

(gdb) c

Continuing.

**********************************

this is function 1!

this is 2 time!

Breakpoint 2, func1 () at ../source/test4.c:18

18 }

(gdb) c

Continuing.

**********************************

this is function 1!

this is 3 time!

Breakpoint 2, func1 () at ../source/test4.c:18

18 }

(gdb) info threads -------------- 查看线程信息,当前位于2号线程

Id Target Id Frame

4 Thread 0x7ffff6dce700 (LWP 40915) "test4" func2 ()

at ../source/test4.c:32

3 Thread 0x7ffff75cf700 (LWP 40914) "test4" func2 ()

at ../source/test4.c:32

* 2 Thread 0x7ffff7dd0700 (LWP 40913) "test4" func1 ()

at ../source/test4.c:18

1 Thread 0x7ffff7dd2700 (LWP 40907) "test4" main ()

at ../source/test4.c:46

(gdb) thread apply 2 4 continue ----- 令2号和4号线程执行continue

Thread 2 (Thread 0x7ffff7dd0700 (LWP 40913)):

Continuing.

**********************************

this is function 1!

this is 4 time!

Breakpoint 2, func1 () at ../source/test4.c:18

18 }

Thread 4 (Thread 0x7ffff6dce700 (LWP 40915)):

Continuing.

**********************************

this is function 2!

this is 3 time!

Breakpoint 3, func2 () at ../source/test4.c:32

32 }

(gdb) thread apply all continue ------------- 所有线程执行continue

Thread 4 (Thread 0x7ffff6dce700 (LWP 40915)):

Continuing.

**********************************

this is function 2!

this is 4 time!

Breakpoint 3, func2 () at ../source/test4.c:32

32 }

Thread 3 (Thread 0x7ffff75cf700 (LWP 40914)):

Continuing.

**********************************

this is function 2!

this is 3 time!

Breakpoint 3, func2 () at ../source/test4.c:32

32 }

Thread 2 (Thread 0x7ffff7dd0700 (LWP 40913)):

Continuing.

**********************************

this is function 1!

this is 5 time!

Breakpoint 2, func1 () at ../source/test4.c:18

18 }

Thread 1 (Thread 0x7ffff7dd2700 (LWP 40907)):

Continuing.

线程1创建成功

线程2创建成功

线程3创建成功

[Thread 0x7ffff6dce700 (LWP 40915) exited]

[Thread 0x7ffff75cf700 (LWP 40914) exited]

[Thread 0x7ffff7dd0700 (LWP 40913) exited]

[Inferior 1 (process 40907) exited normally]

(gdb)

# 8 死锁调试

# 8.1 使用命令

ps -ef|grep <processname>

查看进程号,其中processname为进程名。

gdb attach <PID>

使用GDB调试正在运行的进程。

# 8.2 示例

# 8.2.1 源文件test5.c

  1. /*
  2. *本文件用于测试死锁调试
  3. *
  4. *代码来自网络:http://blog.chinaunix.net/uid-30343738-id-5757210.html
  5. *
  6. */
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <unistd.h>
  10. #include <string.h>
  11. #include <pthread.h>
  12. pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
  13. pthread_mutex_t mutex2 = PTHREAD_MUTEX_INITIALIZER;
  14. pthread_mutex_t mutex3 = PTHREAD_MUTEX_INITIALIZER;
  15. pthread_mutex_t mutex4 = PTHREAD_MUTEX_INITIALIZER;
  16. static int sequence1 = 0;
  17. static int sequence2 = 0;
  18. int func1()
  19. {
  20. pthread_mutex_lock(&mutex1);
  21. ++sequence1;
  22. sleep(1);
  23. pthread_mutex_lock(&mutex2);
  24. ++sequence2;
  25. pthread_mutex_unlock(&mutex2);
  26. pthread_mutex_unlock(&mutex1);
  27. return sequence1;
  28. }
  29. int func2()
  30. {
  31. pthread_mutex_lock(&mutex2);
  32. ++sequence2;
  33. sleep(1);
  34. pthread_mutex_lock(&mutex1);
  35. ++sequence1;
  36. pthread_mutex_unlock(&mutex1);
  37. pthread_mutex_unlock(&mutex2);
  38. return sequence2;
  39. }
  40. void* thread1(void* arg)
  41. {
  42. while (1)
  43. {
  44. int iRetValue = func1();
  45. if (iRetValue == 100000)
  46. {
  47. pthread_exit(NULL);
  48. }
  49. }
  50. }
  51. void* thread2(void* arg)
  52. {
  53. while (1)
  54. {
  55. int iRetValue = func2();
  56. if (iRetValue == 100000)
  57. {
  58. pthread_exit(NULL);
  59. }
  60. }
  61. }
  62. void* thread3(void* arg)
  63. {
  64. while (1)
  65. {
  66. sleep(1);
  67. char szBuf[128];
  68. memset(szBuf, 0, sizeof(szBuf));
  69. strcpy(szBuf, "thread3");
  70. }
  71. }
  72. void* thread4(void* arg)
  73. {
  74. while (1)
  75. {
  76. sleep(1);
  77. char szBuf[128];
  78. memset(szBuf, 0, sizeof(szBuf));
  79. strcpy(szBuf, "thread3");
  80. }
  81. }
  82. int main()
  83. {
  84. pthread_t tid[4];
  85. if (pthread_create(&tid[0], NULL, &thread1, NULL) != 0)
  86. {
  87. _exit(1);
  88. }
  89. if (pthread_create(&tid[1], NULL, &thread2, NULL) != 0)
  90. {
  91. _exit(1);
  92. }
  93. if (pthread_create(&tid[2], NULL, &thread3, NULL) != 0)
  94. {
  95. _exit(1);
  96. }
  97. if (pthread_create(&tid[3], NULL, &thread4, NULL) != 0)
  98. {
  99. _exit(1);
  100. }
  101. sleep(5);
  102. //pthread_cancel(tid[0]);
  103. pthread_join(tid[0], NULL);
  104. pthread_join(tid[1], NULL);
  105. pthread_join(tid[2], NULL);
  106. pthread_join(tid[3], NULL);
  107. pthread_mutex_destroy(&mutex1);
  108. pthread_mutex_destroy(&mutex2);
  109. pthread_mutex_destroy(&mutex3);
  110. pthread_mutex_destroy(&mutex4);
  111. return 0;
  112. }

# 8.2.2 调试过程

执行程序,程序会卡在这里:

root@luo:~/workspace/test/exec\>./test5

另开一个终端,查看进程的信息:

root@luo:~/workspace/test/exec\>ps -ef|grep test5

root 42746 39442 0 14:25 ttyp0 00:00:00 ./test5

root 43464 42753 0 15:11 ttyp2 00:00:00 grep --color=auto test5

使用GDB工具attach该进程:

root@luo:~/workspace/test/exec\>gdb -q attach 42746

attach: No such file or directory.

Attaching to process 42746

Reading symbols from /home/luo/workspace/test/exec/test5...done.

Reading symbols from /lib64/libpthread.so.0...done.

[New LWP 42750]

[New LWP 42749]

[New LWP 42748]

[New LWP 42747]

[Thread debugging using libthread_db enabled]

Using host libthread_db library "/lib64/libthread_db.so.1".

Loaded symbols for /lib64/libpthread.so.0

Reading symbols from /lib64/libc.so.6...(no debugging symbols found)...done.

Loaded symbols for /lib64/libc.so.6

Reading symbols from /lib64/ld-linux-x86-64.so.2...(no debugging symbols found)...done.

Loaded symbols for /lib64/ld-linux-x86-64.so.2

0x00007fc3aa9ff492 in pthread_join (threadid=140478357907200, thread_return=0x0)

at pthread_join.c:92

92 pthread_join.c: No such file or directory.

(gdb) info threads ------------- 查看线程信息

Id Target Id Frame

5 Thread 0x7fc3aa9f2700 (LWP 42747) "test5" __lll_lock_wait ()

at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:135

4 Thread 0x7fc3aa1f1700 (LWP 42748) "test5" __lll_lock_wait ()

at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:135

3 Thread 0x7fc3a99f0700 (LWP 42749) "test5" 0x00000030552b5a0d in nanosleep

() from /lib64/libc.so.6

2 Thread 0x7fc3a91ef700 (LWP 42750) "test5" 0x00000030552b5a0d in nanosleep

() from /lib64/libc.so.6

* 1 Thread 0x7fc3aa9f4700 (LWP 42746) "test5" 0x00007fc3aa9ff492 in pthread_join (threadid=140478357907200, thread_return=0x0) at pthread_join.c:92

(gdb) set scheduler-locking on --------- 设置调试模式为只有当前线程会执行

(gdb) thread apply all bt ------------- 显示所有线程的栈信息

Thread 5 (Thread 0x7fc3aa9f2700 (LWP 42747)):

#0 __lll_lock_wait ()

at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:135

#1 0x00007fc3aaa00457 in _L_lock_913 () from /lib64/libpthread.so.0

#2 0x00007fc3aaa00280 in __GI___pthread_mutex_lock (mutex=0x6012c0 <mutex2>)

at ../nptl/pthread_mutex_lock.c:79

#3 0x00000000004008b1 in func1 () at test5.c:27

#4 0x000000000040094e in thread1 (arg=0x0) at test5.c:52

#5 0x00007fc3aa9fe092 in start_thread (arg=0x7fc3aa9f2700)

at pthread_create.c:309

#6 0x00000030552e42bd in clone () from /lib64/libc.so.6

Thread 4 (Thread 0x7fc3aa1f1700 (LWP 42748)):

#0 __lll_lock_wait ()

at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:135

#1 0x00007fc3aaa00457 in _L_lock_913 () from /lib64/libpthread.so.0

#2 0x00007fc3aaa00280 in __GI___pthread_mutex_lock (mutex=0x601280 <mutex1>)

at ../nptl/pthread_mutex_lock.c:79

#3 0x000000000040090d in func2 () at test5.c:40

#4 0x000000000040097c in thread2 (arg=0x0) at test5.c:65

#5 0x00007fc3aa9fe092 in start_thread (arg=0x7fc3aa1f1700)

at pthread_create.c:309

#6 0x00000030552e42bd in clone () from /lib64/libc.so.6

Thread 3 (Thread 0x7fc3a99f0700 (LWP 42749)):

#0 0x00000030552b5a0d in nanosleep () from /lib64/libc.so.6

#1 0x00000030552b58a4 in sleep () from /lib64/libc.so.6

#2 0x00000000004009b0 in thread3 (arg=0x0) at test5.c:78

#3 0x00007fc3aa9fe092 in start_thread (arg=0x7fc3a99f0700)

at pthread_create.c:309

#4 0x00000030552e42bd in clone () from /lib64/libc.so.6

Thread 2 (Thread 0x7fc3a91ef700 (LWP 42750)):

#0 0x00000030552b5a0d in nanosleep () from /lib64/libc.so.6

#1 0x00000030552b58a4 in sleep () from /lib64/libc.so.6

#2 0x00000000004009f5 in thread4 (arg=0x0) at test5.c:89

#3 0x00007fc3aa9fe092 in start_thread (arg=0x7fc3a91ef700)

at pthread_create.c:309

#4 0x00000030552e42bd in clone () from /lib64/libc.so.6

---Type <return> to continue, or q <return> to quit---

Thread 1 (Thread 0x7fc3aa9f4700 (LWP 42746)):

#0 0x00007fc3aa9ff492 in pthread_join (threadid=140478357907200,

thread_return=0x0) at pthread_join.c:92

#1 0x0000000000400af1 in main () at test5.c:119

从栈信息可以初步判断,有可能是4号和5号线程锁住了。

查看27行和40行源文件的代码:

(gdb) l test5.c:27

22 int func1()

23 {

24 pthread_mutex_lock(&mutex1);

25 ++sequence1;

26 sleep(1);

27 pthread_mutex_lock(&mutex2);

28 ++sequence2;

29 pthread_mutex_unlock(&mutex2);

30 pthread_mutex_unlock(&mutex1);

31

(gdb) l test5.c:40

35 int func2()

36 {

37 pthread_mutex_lock(&mutex2);

38 ++sequence2;

39 sleep(1);

40 pthread_mutex_lock(&mutex1);

41 ++sequence1;

42 pthread_mutex_unlock(&mutex1);

43 pthread_mutex_unlock(&mutex2);

44

看一下4号和5号线程是不是锁住了:

(gdb) thread 5 ------------- 切换到5号线程

[Switching to thread 5 (Thread 0x7fc3aa9f2700 (LWP 42747))]

#0 __lll_lock_wait ()

at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:135

135 ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S: No such file or directory.

(gdb) n ------------- 执行下一步,卡住,Ctrl+C跳出

^C

Program received signal SIGINT, Interrupt.

__lll_lock_wait () at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:135

135 in ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S

(gdb) thread 2 ------------- 切换到2号线程

[Switching to thread 2 (Thread 0x7fc3a91ef700 (LWP 42750))]

#0 0x00000030552b5a0d in nanosleep () from /lib64/libc.so.6

(gdb) n ------------- 执行下一步,可正常执行

Single stepping until exit from function nanosleep,

which has no line number information.

0x00000030552b58a4 in sleep () from /lib64/libc.so.6

(gdb) n

Single stepping until exit from function sleep,

which has no line number information.

thread4 (arg=0x0) at test5.c:91

91 memset(szBuf, 0, sizeof(szBuf));

(gdb) thread 4 ------------- 切换到4号线程

[Switching to thread 4 (Thread 0x7fc3aa1f1700 (LWP 42748))]

#0 __lll_lock_wait ()

at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:135

135 ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S: No such file or directory.

(gdb) n ------------- 执行下一步,卡住

^C^C

Program received signal SIGINT, Interrupt.

__lll_lock_wait () at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:135

135 in ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S

(gdb)

以上方法可调试找出程序中出现死锁的地方。

# 9 core文件调试

# 9.1 使用命令

ulimit -c

查看core文件生成的大小限制,若为0,则表示不会生成core文件。(注:ulimit不会影响其他shell终端)

ulimit -c <size>

设置core文件生成的大小。

cat /proc/sys/kernel/core_pattern

查看core文件路径。

gdb <a.out> <corefile>

调试core文件

# 9.2 示例

# 9.2.1 源代码test6.c

一个能产生core dump的程序

  1. #include <stdio.h>
  2. static void sub(void);
  3. int main(void)
  4. {
  5. sub();
  6. return 0;
  7. }
  8. static void sub(void)
  9. {
  10. int *p = NULL;
  11. /* derefernce a null pointer, expect coredump. */
  12. printf("%d", *p);
  13. }

# 9.2.2 调试过程

查看core文件是否开启:

root@luo:~/workspace/test/exec\>ulimit -c

0

设置core文件大小:

root@luo:~/workspace/test/exec\>ulimit -c 1024

root@luo:~/workspace/test/exec\>ulimit -c

1024

查看core文件路径:

root@luo:~/workspace/test/exec\>cat /proc/sys/kernel/core_pattern

/SE/core-%e-%p

root@luo:~/workspace/test/exec\>ls /SE

ai core--22330 core--4231 log ngtp_agent web_disk

core--21300 core--23374 core--5227 mysql mp.log

执行程序,生成core文件:

root@luo:~/workspace/test/exec\>./test6

Segmentation fault (core dumped)

查看是否生成core文件:

root@luo:~/workspace/test/exec\>ls /SE

ai core--23374 core-test6-44938 ngtp_agent

core--21300 core--4231 log mp.log

core--22330 core--5227 mysql web_disk

使用GDB调试:

root@luo:~/workspace/test/exec\>gdb -q test6 /SE/core-test6-44938

Reading symbols from /home/luo/workspace/test/exec/test6...done.

[New LWP 44938]

Core was generated by `./test6'.

Program terminated with signal 11, Segmentation fault.

#0 0x0000000000400554 in sub () at test6.c:12

12 printf("%d", *p);

(gdb) bt ------------- 显示栈信息

#0 0x0000000000400554 in sub () at test6.c:12

#1 0x0000000000400539 in main () at test6.c:5

(gdb)

可以看到最后入栈的是sub函数里、位于test6.c文件第12行。所以core dump的问题可能出在这里。

# 10 gdb调试

# 10.1 命令介绍

gdb脚本基于gdb命令实现,可在虚拟机和设备上直接运行。使用此脚本可批量对多个进程执行给定命令,也可以调试-i指定的非进程。

命令 gdb
命令格式 gdb [-s|-p] [-w] [-F 'SEPERATOR'] [-i '_PIDS'] [-e '_PIDS'] -c|-f 'CMD_ARGS'
参数说明 -s 串行执行CMD(依次对每个执行CMD;默认选项) -p 并行执行CMD(同时对每个执行CMD) -w 等待所有上都执行CMD完毕,否则任意执行完CMD都将停止其他上的执行(仅对-p有效) -i 使用指定的 pids(多个pid以空格分隔),若不指定则自动扫描所有进程 -e 剔除指定的 pids(多个pid以空格分隔) -c 命令列表(多条命令以';'或-F指定的分隔符进行分隔) -f 命令文件(对于带有分支、循环等复杂控制的多条命令,推荐采用命令文件形式) -F 命令列表中的分隔符(默认为';')

# 10.2 使用示例

  1. 获取mempool状态。(PID应为master或nae的pid)

    gdb -c 'call rte_mempool_list_dump(stdout)' -i <PID>

    gdb -c 'call cfg_callback_test_coredump(0,0)' -i $pid

    gdb -c '' -i $pid

  2. 临时在指定位置添加打印函数。

    gdb -p -c 'b test.c:45; commands; echo ----will bug_on----\n; bt; c; end; c'

  3. 验证RCU是否执行session释放。

    gdb -p -c 'handle all noprint nostop; b _free_mobj if mid==session_mobj; commands; info thread; bt; end; c'

  4. 显示所有进程的calltrace信息及本地变量。

    说明:对于多、无断点场景下的私有数据、状态,可串行顺序执行。

    gdb -c 'bt full'

  5. 显示所有进程/线程的calltrace信息。(类似于tdb的info state)

说明:对于多、无断点场景下的私有数据、状态,可串行顺序执行。

gdb -c 'thread apply all bt'

  1. 查看每个进程的私有全局变量engine_id、session_local,并打印CallTrace。

    gdb -c 'p engine_id; p/x *session_local; bt'

  2. 对指定进程11662,在其neigh.c:1235行的BUG_ON(1)处设置断点,生成core文件。

    说明:这种方式生成的core文件不同于由内核生成的/SE/core--PID,它含有共享内存的绝大部分数据,便于深入分析。须注意的是这种core文件一般较大,可能达到几个GB,因此要保证足够的存储空间;存储可能需要十几秒或几十秒。若不指定文件名,则在当前目录下生成名为core.PID的core文件(此时可提前cd到/SE下)。

    gdb -c 'b neigh.c:1235; commands; silent; gcore /home/luo/workspace/core-neigh.11662; c; end; c' -i 11662

  3. 对指定进程11662,在其ut函数处设置断点,每个报文到来则打印tbuf信息。

说明:对单个进程,不存在串行/并行的区别,可按串行处理。

gdb -c 'b ut; commands; silent; p/x *tbuf; c; end; c' -i 11662

  1. 打开分片重组部分的调试开关debug_ip4_frag_recv、debug_ip4_mtu_send。

说明:这两个变量都为共享数据,只需设置单个即可,如pid为11662。

gdb -c 'set debug_ip4_frag_recv=1; set debug_ip4_mtu_send=1; printf "recv=%d,send=%d",debug_ip4_frag_recv,debug_ip4_mtu_send' -i 11662

  1. 对所有进程设置条件指令断点,触发后执行指定命令,执行命令后继续执行不退出。

说明:对于涉及多的有断点场景,应使用并行模式。

gdb -p -c 'b test.c:22 if cnt%6==4; commands; silent; echo --trace--\n; bt; printf "\nname=%s cnt=%d\n", name, cnt; c; end; c'

该命令序列也可写入命令文件:(-f /tmp/a.gdb)

handle all noprint nostop

b test.c:22 if cnt%6==4

commands

silent

echo --trace--\n

bt

printf "\nname=%s cnt=%d\n", name, cnt

c

end

c

[注]:最后的c命令,使得设完断点及commands后继续运行,倒数第二条c命令,使得断点触发/处理后仍继续运行。

  1. 对所有进程设置数据断点,当数值被改变时,打印CallTrace。

    说明:watch可监控数据是否被改变,rwatch可监控数据是否被读取,awatch包括这两类。

    gdb -p -c 'watch st.age; commands; bt; end; c; c'

  2. 对每个设置多个断点,每个断点触发时打印CallTrace及文件/函数/行信息。

    说明:每个断点对应自己的触发处理,此处采用了自定义命令hit_me的方式。

    gdb -p -f /tmp/b.gdb

    handle all noprint nostop

    define hit_me

    echo \n>>>hit_me>>>\n

    bt

    info thread

    end

    b test.c:24

    commands

    hit_me

    c

    end

    b test.c:36

    commands

    hit_me

    c

    end

    c

  3. 查看phy_dev[]中ifindex为26的结构体。

    说明:phy_dev为共享数据,因此只需查看单个即可,如pid为11662。命令序列略繁,可写入命令文件。

    gdb -f /tmp/dev.gdb -i 11662

    脚本/tmp/dev.gdb内容如下:

    handle all noprint nostop

    set print pretty

    set $idx=26

    set $i=0

    while ($i<256)

    set $d = (struct dev*)phy_dev[$i]

    if ($d == 0)

    loop_break

    end

    if ($d->ifindex==$idx)

    p/x *$d

    loop_break

    end

    set $i = $i+1

    end

  4. 查看挂接在链表mirror_filter_list上的每个filter节点。

说明:mirror_filter_list为共享数据,因此只需查看单个即可,如pid为11662。

gdb -f /tmp/mirror_filter.gdb -i 11662

脚本mirror_filter.gdb内容如下:

handle all noprint nostop

set print pretty

p/x &mirror_filter_list

set $f=mirror_filter_list.next

while (1)

if ($f==&mirror_filter_list)

echo [end of list]

loop_break

end

p/x *(struct mirror_filter_t*)$f

set $f=((struct list_head*)$f)->next

end

  1. 获取进程core大小限制。

    gdb -c 'p getrlimit(4,$rsp-32); x/2xg $rsp-32'

+ + + diff --git a/blogs/acknowledge/locktest.html b/blogs/acknowledge/locktest.html new file mode 100644 index 0000000..b6481ec --- /dev/null +++ b/blogs/acknowledge/locktest.html @@ -0,0 +1,312 @@ + + + + + + mutex、读写锁、自旋锁、信号量以及RCU的性能测试 | 斯人如彩虹 + + + + + + + + + + + +

mutex、读写锁、自旋锁、信号量以及RCU的性能测试

6/12/2022 知识

# mutex、读写锁、自旋锁、信号量以及RCU的性能测试

# 前言

本例为一个读线程和一个写线程,在不同加锁情况下测试一秒钟读写次数 +没有测试多线程情况,结果只有参考意义 +读写次数还与cpu频率相关 但大致不同种类的锁性能比较差距不大 +测试源码和过程在最下面

# 一、直接上结论

# 1、以下为每秒读写次数

次数与cpu频率相关,不同机器测试结果不同(这里使用ubuntu20.04虚拟机测试的)

读写锁 21000k

mutex 31000k

自旋锁 58000k

信号量 27000k

rcu 47000k

# 2、锁的特点和使用场景

自旋锁特点 循环等待等 力度很小 用于链表头指针改变等情况

mutex 加锁时线程休眠一会看一下 可用于大部分情况

读写锁 读写都要判断 加锁复杂 不推荐使用

信号量 pv操作 比mutex低一点

rcu 读写锁变种 read copy update 可以代替读写锁情况

# 二、环境准备

编译命令
+
    gcc -o rcu rcu.c -lpthread -lurcu
+
1
rcu锁需要安装liburcu-dev
+
    apt-get install liburcu-dev
+
1

# 三、实际测试结果

不加锁

root@luo:~/workspace/test# ./rcu 
+Error: x:2340421, y:3524383
+
1
2

读写锁

root@luo:~/workspace/test# ./rcu 
+reads: 19500709, 19500 K reads/sec
+reads: 44758029, 22379 K reads/sec
+reads: 65393430, 21797 K reads/sec
+reads: 85189522, 21297 K reads/sec
+
+
1
2
3
4
5
6

信号量

root@luo:~/workspace/test# ./rcu 
+reads: 27627678, 27627 K reads/sec
+reads: 55094966, 27547 K reads/sec
+reads: 82395410, 27465 K reads/sec
+reads: 109609817, 27402 K reads/sec
+
1
2
3
4
5

mutex

root@luo:~/workspace/test# ./rcu 
+reads: 32018261, 32018 K reads/sec
+reads: 63767452, 31883 K reads/sec
+reads: 95838658, 31946 K reads/sec
+reads: 127792109, 31948 K reads/sec
+
+
1
2
3
4
5
6

自旋锁

root@luo:~/workspace/test# ./rcu 
+reads: 57844075, 57844 K reads/sec
+reads: 117047083, 58523 K reads/sec
+reads: 173215973, 57738 K reads/sec
+reads: 229239811, 57309 K reads/sec
+
+
1
2
3
4
5
6

RCU

root@luo:~/workspace/test# ./rcu 
+reads: 47511136, 47511 K reads/sec
+reads: 94736084, 47368 K reads/sec
+reads: 141648406, 47216 K reads/sec
+reads: 188779939, 47194 K reads/sec
+
+
1
2
3
4
5
6

# 四、 源码

rcu.c

#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include <pthread.h>
+#include <limits.h>
+#include <semaphore.h>
+
+#include <urcu.h>
+
+struct point {
+	int x;
+	int y;
+};
+
+struct point *gp;
+int done = 0;
+long reads = 0;
+
+
+pthread_rwlock_t rwlock;
+pthread_mutex_t mutex;
+pthread_spinlock_t spinlock;
+sem_t sem;
+
+void *timer(void *arg) {
+
+	struct timespec ts, ts2;
+	timespec_get(&ts, TIME_UTC);
+
+	while (!done) {
+
+		sleep(1);
+		timespec_get(&ts2, TIME_UTC);
+
+		time_t sec = ts2.tv_sec - ts.tv_sec;
+
+		printf("reads: %ld, %ld K reads/sec\n", reads, (reads/sec)/1000);
+
+	}
+
+}
+
+void *updater(void *arg) {
+
+	struct point *p;
+	struct point *old;
+
+	int i = 0;
+	for (i = 0;i < INT_MAX;i ++) {
+
+		p = malloc(sizeof(struct point));
+
+		p->x = i;
+		p->y = i+1;
+
+		old = gp;
+#if 0
+		gp = p;
+
+#elif 0
+		pthread_rwlock_wrlock(&rwlock);
+		gp = p;
+		pthread_rwlock_unlock(&rwlock);
+
+#elif 0
+
+		pthread_mutex_lock(&mutex);
+		gp = p;
+		pthread_mutex_unlock(&mutex);
+
+#elif 0
+
+		pthread_spin_lock(&spinlock);
+		gp = p;
+		pthread_spin_unlock(&spinlock);
+
+#elif 1
+
+		rcu_assign_pointer(gp, p);
+		synchronize_rcu();
+
+#else
+
+		sem_wait(&sem);
+		gp = p;
+		sem_post(&sem);
+
+#endif
+		free(old);
+		
+	}
+
+}
+
+void *reader(void *arg) {
+
+	rcu_register_thread(); //urcu
+
+	while (!done) {
+
+		int x, y;
+#if 0
+		x = gp->x;
+		y = gp->y;
+#elif 0
+		pthread_rwlock_rdlock(&rwlock);
+		x = gp->x;
+		y = gp->y;
+		pthread_rwlock_unlock(&rwlock);
+
+#elif 0
+
+		pthread_mutex_lock(&mutex);
+		x = gp->x;
+		y = gp->y;
+		pthread_mutex_unlock(&mutex);
+
+#elif 0
+
+		pthread_spin_lock(&spinlock);
+		x = gp->x;
+		y = gp->y;
+		pthread_spin_unlock(&spinlock);
+
+#elif 1
+
+		rcu_read_lock();
+
+		struct point *p = rcu_dereference(gp);
+		x = p->x;
+		y = p->y;
+
+		rcu_read_unlock();
+
+#else
+
+		sem_wait(&sem);
+		x = gp->x;
+		y = gp->y;
+		sem_post(&sem);
+
+#endif
+		reads ++;
+
+		if (y != x+1) {
+			printf("Error: x:%d, y:%d\n", x, y);
+			done = 1;
+			break;
+		}
+
+	}
+
+	rcu_unregister_thread();
+
+	exit(1);
+}
+
+
+int main() {
+
+	pthread_t tid[3];
+
+	pthread_rwlock_init(&rwlock, NULL);
+	pthread_mutex_init(&mutex, NULL);
+	pthread_spin_init(&spinlock, PTHREAD_PROCESS_SHARED);
+	sem_init(&sem, 0, 1);
+
+	rcu_init(); // rcu 
+
+	gp = malloc(sizeof(struct point));
+	gp->x = 1;
+	gp->y = 2;
+
+	pthread_create(&tid[0], NULL, updater, NULL);
+	pthread_create(&tid[1], NULL, reader, NULL);
+	pthread_create(&tid[2], NULL, timer, NULL);
+
+	int i = 0;
+	for (i = 0;i < 3;i ++) {
+		pthread_join(tid[i], NULL);
+	}
+
+	free(gp);
+}
+
+
+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
+ + + diff --git a/blogs/acknowledge/memoryleak.html b/blogs/acknowledge/memoryleak.html new file mode 100644 index 0000000..cc8cffd --- /dev/null +++ b/blogs/acknowledge/memoryleak.html @@ -0,0 +1,213 @@ + + + + + + gdb查看堆内存以及内存泄漏的一种定位方法 | 斯人如彩虹 + + + + + + + + + + + +

gdb查看堆内存以及内存泄漏的一种定位方法

6/26/2022 知识

# 方法

循环分配10000个类对象 然后查看内存空间源码在最下面

对c++类的虚函数有基本了解

# 编译命令

g++ -o memtest memtest.cpp -g -O0
+
1

# 直接开始

@luo:~/workspace/memtest# gdb memtest <----------------------- 使用gdb 调试memtest
+GNU gdb (Ubuntu 9.2-0ubuntu1~20.04.1) 9.2
+...
+...
+Reading symbols from memtest...
+(gdb) r <------------------------------------------------------开始运行
+Starting program: /root/workspace/memtest/memtest 
+terminate called after throwing an instance of 'std::bad_alloc'
+  what():  std::bad_alloc
+
+Program received signal SIGABRT, Aborted.
+__GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
+50	../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
+(gdb) info proc <---------------------------------------------查看当前进程信息
+process 2132 <------------------------------------------------ 当前进程pid
+cmdline = '/root/workspace/memtest/memtest'
+cwd = '/root/workspace/memtest'
+exe = '/root/workspace/memtest/memtest'
+(gdb) shell pmap -x 2132 <------------------------------------ 使用pmap查看内存映射
+2132:   /root/workspace/memtest/memtest
+Address           Kbytes     RSS   Dirty Mode  Mapping
+0000555555554000       4       4       4 r---- memtest
+0000555555555000       4       4       4 r-x-- memtest
+0000555555556000       4       4       0 r---- memtest
+0000555555557000       4       4       4 r---- memtest
+0000555555558000       4       4       4 rw--- memtest
+0000555555559000     396     324     324 rw---   [ anon ] <------堆内存地址
+00007ffff7a7d000      16      16      16 rw---   [ anon ]
+00007ffff7a81000      12      12       0 r---- libgcc_s.so.1
+00007ffff7a84000      72      72       0 r-x-- libgcc_s.so.1
+00007ffff7a96000      16      16       0 r---- libgcc_s.so.1
+00007ffff7a9a000       4       4       4 r---- libgcc_s.so.1
+00007ffff7a9b000       4       4       4 rw--- libgcc_s.so.1
+00007ffff7a9c000      52      52       0 r---- libm-2.31.so
+00007ffff7aa9000     668     256       0 r-x-- libm-2.31.so
+00007ffff7b50000     612       0       0 r---- libm-2.31.so
+00007ffff7be9000       4       4       4 r---- libm-2.31.so
+00007ffff7bea000       4       4       4 rw--- libm-2.31.so
+00007ffff7beb000     136     136       0 r---- libc-2.31.so
+00007ffff7c0d000    1504     848       8 r-x-- libc-2.31.so
+00007ffff7d85000     312     172       0 r---- libc-2.31.so
+00007ffff7dd3000      16      16      16 r---- libc-2.31.so
+00007ffff7dd7000       8       8       8 rw--- libc-2.31.so
+00007ffff7dd9000      16      12      12 rw---   [ anon ]
+00007ffff7ddd000     600     600       0 r---- libstdc++.so.6.0.28
+00007ffff7e73000     964     628       4 r-x-- libstdc++.so.6.0.28
+00007ffff7f64000     292     164       0 r---- libstdc++.so.6.0.28
+00007ffff7fad000       4       0       0 ----- libstdc++.so.6.0.28
+00007ffff7fae000      44      44      44 r---- libstdc++.so.6.0.28
+00007ffff7fb9000      12      12      12 rw--- libstdc++.so.6.0.28
+00007ffff7fbc000      20      20      20 rw---   [ anon ]
+00007ffff7fcb000      12       0       0 r----   [ anon ]
+00007ffff7fce000       4       4       4 r-x--   [ anon ]
+00007ffff7fcf000       4       4       0 r---- ld-2.31.so
+00007ffff7fd0000     140     140      24 r-x-- ld-2.31.so
+00007ffff7ff3000      32      32       0 r---- ld-2.31.so
+00007ffff7ffc000       4       4       4 r---- ld-2.31.so
+00007ffff7ffd000       4       4       4 rw--- ld-2.31.so
+00007ffff7ffe000       4       4       4 rw---   [ anon ]
+00007ffffffde000     132      12      12 rw---   [ stack ]
+ffffffffff600000       4       0       0 --x--   [ anon ]
+---------------- ------- ------- ------- 
+total kB            6148    3648     548
+													计算方法 396*1024/8=50688
+(gdb) x/50688a 0x0000555555559000  <----------------------- 查看堆内存地址数据
+0x555555559000:	0x0	0x291
+...
+...
+0x55555556aea0:	0x0	0x21
+0x55555556aeb0:	0x555555557cd0 <_ZTV7MEMTEST+16>	0xbb114514aa114514
+0x55555556aec0:	0x0	0x21
+0x55555556aed0:	0x555555557cd0 <_ZTV7MEMTEST+16>	0xbb114514aa114514
+0x55555556aee0:	0x0	0x21
+0x55555556aef0:	0x555555557cd0 <_ZTV7MEMTEST+16>	0xbb114514aa114514
+0x55555556af00:	0x0	0x21
+0x55555556af10:	0x555555557cd0 <_ZTV7MEMTEST+16>	0xbb114514aa114514
+...
+
+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78

使用 c++filt翻译函数符号名称_ZTV7MEMTEST为MEMTEST虚表指针

root@luo:~/workspace/memtest# c++filt _ZTV7MEMTEST
+vtable for MEMTEST
+
1
2

顺便查看一下虚函数表存的什么,~MEMTEST为虚析构函数地址(c++的多态相关)

(gdb) x/10a 0x555555557cd0
+0x555555557cd0 <_ZTV7MEMTEST+16>:	0x555555555330 <MEMTEST::~MEMTEST()>	0x55555555534e <MEMTEST::~MEMTEST()>
+
1
2

在类中没有虚函数时的内存

0x55555556aea0:	0x0	0x21
+0x55555556aeb0:	0xbb114514aa114514	0x0
+0x55555556aea0:	0x0	0x21
+0x55555556aeb0:	0xbb114514aa114514	0x0
+
1
2
3
4

在类中有虚函数时的内存

0x55555556aea0:	0x0	0x21
+0x55555556aeb0:	0x555555557cd0 <_ZTV7MEMTEST+16>	0xbb114514aa114514
+0x55555556aec0:	0x0	0x21
+0x55555556aed0:	0x555555557cd0 <_ZTV7MEMTEST+16>	0xbb114514aa114514
+0x55555556aee0:	0x0	0x21
+0x55555556aef0:	0x555555557cd0 <_ZTV7MEMTEST+16>	0xbb114514aa114514
+
1
2
3
4
5
6

# 源码memtest.cpp

#include <iostream>
+using namespace std;
+
+class MEMTEST
+{
+public:
+    // 注释掉后就没有 虚表指针 0x555555557cd0 <_ZTV7MEMTEST+16>
+    virtual ~MEMTEST() {}
+
+    int i;
+    int j;
+};
+
+void f()
+{
+    for (int i = 0; i < 10000; ++i)
+    {
+        //
+        MEMTEST *p = new MEMTEST;
+        p->i = 0xAA114514;
+        p->j = 0xBB114514;
+    }
+
+    throw std::bad_alloc();
+}
+
+int main()
+{
+    f();
+
+    return 0;
+}
+
+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
+ + + diff --git a/blogs/acknowledge/perf_flamegraph.html b/blogs/acknowledge/perf_flamegraph.html new file mode 100644 index 0000000..c39af68 --- /dev/null +++ b/blogs/acknowledge/perf_flamegraph.html @@ -0,0 +1,184 @@ + + + + + + perf工具和火焰图简介 | 斯人如彩虹 + + + + + + + + + + + +

perf工具和火焰图简介

7/24/2022 知识

# 1 perf工具和火焰图简介

能做什么:

可以分析函数执⾏的频繁程度

可以分析哪些函数经常阻塞

可以分析哪些函数频繁分配内存

Flame Graph 原图路径:https://queue.acm.org/downloads/2016/Gregg4.svg

img

# 2 通过perf收集函数堆栈信息绘制火焰图

# 2.1 安装perf

perf 命令(performance 的缩写)讲起, 它是 Linux 系统原⽣提供的性能分析⼯具, 会返回 CPU 正在执⾏的函数名以及调⽤栈(stack)

安装perf

 apt install linux-tools-common
+
1

测试perf是否可用 perf.data为产生的文件

┌──(root💀luo)-[~/workspace/flamegraph/src-flamegraph/test]
+└─# perf record -F 99 -a -g -- sleep 10
+[ perf record: Woken up 1 times to write data ]
+[ perf record: Captured and wrote 0.598 MB perf.data (3370 samples) ]
+
+┌──(root💀luo)-[~/workspace/flamegraph/src-flamegraph/test]
+└─# ls
+perf.data  perf.data.old  test  test.c
+
1
2
3
4
5
6
7
8

# 2.2 编译并运行测试程序

test.c 源码和接受在最下面

┌──(root💀luo)-[~/workspace/flamegraph/src-flamegraph/test]
+└─# gcc -o test test.c -g
+┌──(root💀luo)-[~/workspace/flamegraph/src-flamegraph/test]
+└─# ./test 
+main into
+
1
2
3
4
5

# 2.3 使用perf采集数据

perf record 表示采集系统事件, 没有使⽤ -e 指定采集事件, 则默认采集 cycles(即 CPU clock 周

期), -F 99 表示每秒 99 次, -p pidof test是进程号, 即对哪个进程进⾏分析, -g 表示记录调⽤栈,

sleep 30 则是持续 30 秒.

┌──(root💀luo)-[~/workspace/flamegraph/src-flamegraph/test]
+└─# perf record -F 99 -p `pidof test` -g -- sleep 30 
+[ perf record: Woken up 1 times to write data ]
+[ perf record: Captured and wrote 0.235 MB perf.data (2962 samples) ]
+
+┌──(root💀luo)-[~/workspace/flamegraph/src-flamegraph/test]
+└─# ls
+perf.data  perf.data.old  test  test.c
+
1
2
3
4
5
6
7
8

使用perf report 可以看到堆栈热点函数

┌──(root💀luo)-[~/workspace/flamegraph/src-flamegraph/test]
+└─# perf report 
+
+Samples: 2K of event 'cpu-clock:pppH', Event count (approx.): 29919191620             
+  Children      Self  Command  Shared Object      Symbol                              
++  100.00%     0.00%  test     libc-2.31.so       [.] __libc_start_main
++  100.00%    29.71%  test     test               [.] main
++   35.58%    35.55%  test     test               [.] func_c
++   19.85%    19.85%  test     test               [.] func_b
++   14.85%     9.55%  test     test               [.] func_a
++    5.30%     5.30%  test     test               [.] func_d
+     0.03%     0.03%  test     [kernel.kallsyms]  [k] __lock_text_start
+     0.03%     0.00%  test     [kernel.kallsyms]  [k] apic_timer_interrupt
+     0.03%     0.00%  test     [kernel.kallsyms]  [k] smp_apic_timer_interrupt
+     0.03%     0.00%  test     [kernel.kallsyms]  [k] irq_exit
+     0.03%     0.00%  test     [kernel.kallsyms]  [k] __softirqentry_text_start
+     0.03%     0.00%  test     [kernel.kallsyms]  [k] run_timer_softirq
+     0.03%     0.00%  test     [kernel.kallsyms]  [k] __run_timers.part.0
+     0.03%     0.00%  test     [kernel.kallsyms]  [k] call_timer_fn
+     0.03%     0.00%  test     [kernel.kallsyms]  [k] rh_timer_func
+     0.03%     0.00%  test     [kernel.kallsyms]  [k] usb_hcd_poll_rh_status
+     0.03%     0.00%  test     [kernel.kallsyms]  [k] uhci_hub_status_data
+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

# 2.4 下载火焰图脚本

https://github.com/brendangregg/FlameGraph

git clone https://gitee.com/mirrors/FlameGraph.git

┌──(root💀luo)-[~/workspace/flamegraph/src-flamegraph/test]
+└─# git clone https://gitee.com/mirrors/FlameGraph.git 
+Cloning into 'FlameGraph'...
+remote: Enumerating objects: 1147, done.
+remote: Total 1147 (delta 0), reused 0 (delta 0), pack-reused 1147
+Receiving objects: 100% (1147/1147), 1.87 MiB | 806.00 KiB/s, done.
+Resolving deltas: 100% (674/674), done.
+
+┌──(root💀luo)-[~/workspace/flamegraph/src-flamegraph/test]
+└─# ls
+FlameGraph  perf.data  perf.data.old  test  test.c
+
+┌──(root💀luo)-[~/workspace/flamegraph/src-flamegraph/test]
+└─# ls FlameGraph/
+aix-perf.pl                      stackcollapse-gdb.pl
+demos                            stackcollapse-go.pl
+dev                              stackcollapse-instruments.pl
+...
+...
+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# 2.5 生成火焰图

┌──(root💀luo)-[~/workspace/flamegraph/src-flamegraph/test]
+└─# perf script | ./FlameGraph/stackcollapse-perf.pl | ./FlameGraph/flamegraph.pl > process.svg
+
1
2

下载到windows桌面用浏览器打开查看效果

https://lzwtty.oss-cn-hangzhou.aliyuncs.com/blogimage/acknowledge/test_flamegraph.svg

img

可以很清晰的看到热点函数调用占用cpu使用率

# 2.5 ⽕焰图的含义

⽕焰图是基于 stack 信息⽣成的 SVG 图⽚, ⽤来展示 CPU 的调⽤栈。

  • y 轴表示调⽤栈, 每⼀层都是⼀个函数. 调⽤栈越深, ⽕焰就越⾼, 顶部就是正在执⾏的函数, 下

⽅都是它的⽗函数.

  • x 轴表示抽样数, 如果⼀个函数在 x 轴占据的宽度越宽, 就表示它被抽到的次数多, 即执⾏的时

间⻓. 注意, x 轴不代表时间, ⽽是所有的调⽤栈合并后, 按字⺟顺序排列的.

  • ⽕焰图就是看顶层的哪个函数占据的宽度最⼤. 只要有 “平顶”(plateaus), 就表示该函数可能存

在性能问题。

  • 颜⾊没有特殊含义, 因为⽕焰图表示的是 CPU 的繁忙程度, 所以⼀般选择暖⾊调.

# 源码test.c

#include <stdio.h>
+
+void func_d() // 5
+{
+    for (int i = 5 * 10000; i--;); //5
+}
+void func_a()  // 10+5= 15
+{
+    for (int i = 10 * 10000; i--;); //10 
+    func_d();   //5 
+}
+void func_b()
+{
+    for (int i = 20 * 10000; i--;);  // 20
+}
+void func_c()
+{
+    for (int i = 35 * 10000; i--;); // 35
+}
+int main(void)
+{
+    printf("main into\n");
+    while (1)  // 100
+    {
+        for (int i = 30 * 10000; i--;); // 30 
+        func_a(); //10+5 =15
+        func_b(); // 20
+        func_c(); // 35
+    }
+    printf("main end\n");
+    return 0;
+}
+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
+ + + diff --git a/blogs/acknowledge/site.html b/blogs/acknowledge/site.html new file mode 100644 index 0000000..f0fc2ba --- /dev/null +++ b/blogs/acknowledge/site.html @@ -0,0 +1,87 @@ + + + + + + 有用的知识网站 | 斯人如彩虹 + + + + + + + + + + + +

有用的知识网站

6/12/2024 知识

# 学习网站

小林coding的图解系统 (opens new window)

代码随想录 (opens new window)

好用的在线思维导图 (opens new window)

# 博客地址

高并发系统之限流特技 (opens new window)

动态链接库中函数的地址确定---PLT和GOT (opens new window)

Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈 (opens new window)

Redis和Memcached的区别 (opens new window)

epoll内核源码详解+自己总结的流程 (opens new window)

后台开发面试问题整理 (opens new window)

Linux内核:poll机制 (opens new window)

linux任务调度机制 (opens new window)

Linux内核:poll机制 (opens new window)

解读Raft(一 算法基础) - 杭州.Mark - 博客园 (opens new window)

Linux文件系统详解 - AlanTu - 博客园 (opens new window)

Linux c 开发 - 内存管理器ptmalloc - CSDN博客 (opens new window)

Linux环境变量及其设置 - CSDN博客 (opens new window)

比较全面的gdb调试命令 - 知识天地 - 博客园 (opens new window)

把握linux内核设计思想(六):内核时钟中断 - CSDN博客 (opens new window)

Linux进程调度原理 - alex.shu - 博客园 (opens new window)

Linux系统调用的实现机制分析 - CSDN博客 (opens new window)

理解inode - 阮一峰的网络日志 (opens new window)

多阶hash表 - juary_的专栏 - CSDN博客 (opens new window)

理解 glibc malloc - CSDN博客 (opens new window)

Redis与Memcached的比较-zpf1218-ChinaUnix博客 (opens new window)

glibc中malloc的详细解释 - CSDN博客 (opens new window)

Redis的那些最常见面试问题 - 回首笑人间 - 博客园 (opens new window)

浅析基于glibc的malloc - CSDN博客 (opens new window)

slab机制 - wangLinuxer - 博客园 (opens new window)

有感于STL的内存管理 (opens new window)

DNS使用的是TCP协议还是UDP协议 - qq100440110的专栏 - CSDN博客 (opens new window)

Linux的任务调度机制 - Nicholas的专栏 - CSDN博客 (opens new window)

进程—内存描述符(mm_struct) - CSDN博客 (opens new window)

彻底弄懂HTTP缓存机制及原理 - 木上有水 - 博客园 (opens new window)

利用CAS操作(Compare & Set)实现无锁队列 - CSDN博客 (opens new window)

进程间通信的方式——信号、管道、消息队列、共享内存 - 0giant - 博客园 (opens new window)

TCP的数据流——滑动窗口,拥塞窗口,慢启动,Nagle算法,经受时延的确认等 - 千里之外 - CSDN博客 (opens new window)

TCP协议总结--停止等待协议,连续ARQ协议,滑动窗口协议 - 杨博东的博客 - 博客园 (opens new window)

C/C++ 笔试、面试题目大汇总 - fangyukuan - 博客园 (opens new window)

C/C++ 内存对齐原则及作用 - chy19911123的专栏 - CSDN博客 (opens new window)

mysql数据库面试总结 - bullets - 博客园 (opens new window)

[学习笔记]数据库设计三大范式与BCNF,学习笔记 - ybwang1989 - 博客园 (opens new window)

常见面试题整理--数据库篇(每位开发者必备) - weinierzui的专栏 - CSDN博客 (opens new window)

知识库 - 你身边的技术百科全书 - CSDN (opens new window)

进程上下文与线程上下文 - bingshanyijiao_fkx的专栏 - CSDN博客 (opens new window)

linux线程切换和进程切换的方法_Linux_脚本之家 (opens new window)

深入理解计算机系统之虚拟存储器 - Al_xin的专栏 - CSDN博客 (opens new window)

tcp的半连接与完全连接队列 - go4it - 简书 (opens new window)

数位dp总结 之 从入门到模板 - 努力 - CSDN博客 (opens new window)

类中函数的重载、隐藏和覆盖 - beaglebone - 博客园 (opens new window)

排序算法____基数排序 - Dingwj_blog - 博客园 (opens new window)

面试题干货在此_讨论区_牛客网 (opens new window)

排序算法系列:基数排序 - 大鱼 - CSDN博客 (opens new window)

位图索引:原理(BitMap index) - zhanlijun - 博客园 (opens new window)

fopen与open的区别 - 清清飞扬 - 博客园 (opens new window)

《深入理解计算机系统》-虚拟存储器 - gatsby_dhn - 简书 (opens new window)

Linux内核解析:进程间通信:管道 - 笨拙的菜鸟 - 博客园 (opens new window)

参考别人的面试总结:linux C/C++服务器后台开发面试题总结 - 大孟的博客 - CSDN博客 (opens new window)

linux C/C++服务器后台开发面试题总结 - Nancy26 - 博客园 (opens new window)

ELF 文件中的section 和 segment - wo_der的博客 - CSDN博客 (opens new window)

聊聊Linux动态链接中的PLT和GOT(1)——何谓PLT与GOT - 海枫的专栏 - CSDN博客 (opens new window)

ELF文件的加载和动态链接过程 - - ITeye博客 (opens new window)

ELF文件的加载过程(load_elf_binary函数详解)--Linux进程的管理与调度(十三) - AderStep - CSDN博客 (opens new window)

linux awk命令详解 - ggjucheng - 博客园 (opens new window)

IP分片和TCP分片的区别 - cumirror的专栏 - CSDN博客 (opens new window)

fork()----父子进程共享 - 程序狗的成长之路 - CSDN博客 (opens new window)

Makefile中的wildcard用法 - liangkaiming的专栏 - CSDN博客 (opens new window)

深入理解C++的动态绑定和静态绑定 - 常高伟的专栏 - CSDN博客 (opens new window)

C++模板元编程(C++ template metaprogramming) - 文章 - 伯乐在线 (opens new window)

C++后台开发校招面试常见问题 - oscarwin - CSDN博客 (opens new window)

互斥锁的实现(转) - hzhzh007的专栏 - CSDN博客 (opens new window)

TCP-IP详解:糊涂窗口综合症(Silly Window syndrome) - 深邃 精致 内涵 坚持 - CSDN博客 (opens new window)

浅析Linux下的task_struct结构体 - qq_29503203的博客 - CSDN博客 (opens new window)

C++虚继承的概念 - crystal_avast的专栏 - CSDN博客 (opens new window)

c++ 虚继承与继承的差异 - Kikim的地盘 - CSDN博客 (opens new window)

Linux的inode的理解 - iTech - 博客园 (opens new window)

IPC通信:Posix消息队列 - liuhongxiangm的专栏 - CSDN博客 (opens new window)

Linux线程的信号量同步 - JollyWing - 博客园 (opens new window)

Linux进程间通信——使用共享内存 - ljianhui的专栏 - CSDN博客 (opens new window)

gdb调试coredump(使用篇) - 叶落无痕,枫过有情…… - CSDN博客 (opens new window)

信号中断 与 慢系统调用 - 许振坪的专栏 - CSDN博客 (opens new window)

浅析CPU中断技术 - Funeral - 博客园 (opens new window)

Linux信号(signal) 机制分析 - h13 - 博客园 (opens new window)

EPOLLIN , EPOLLOUT , EPOLLPRI, EPOLLERR 和 EPOLLHUP事件 - yingying.liu的专栏 - CSDN博客 (opens new window)

三种工厂模式的分析以及C++实现 - 曾经的你| - 博客园 (opens new window)

STL源码剖析---红黑树原理详解上 - Hackbuteer1的专栏 - CSDN博客 (opens new window)

valgrind 的使用简介 - sduliulun的专栏 - CSDN博客 (opens new window)

_unix linux_脚本之家 (opens new window)

GDT(Global Descriptor Table)全局描述符表 - starlitnext - 博客园 (opens new window)

Linux程序加载过程 - 赢在拼搏中 - CSDN博客 (opens new window)

linux 用户空间与内核空间——高端内存详解 - 立超的专栏 - 博客园 (opens new window)

Linux虚拟地址空间布局以及进程栈和线程栈总结 - wilcohuang's blog - CSDN博客 (opens new window)

堆排算法的分析与总结 - HOU_JUN - 博客园 (opens new window)

HTTP必知必会——常见面试题总结 - Leeon的博客 - CSDN博客 (opens new window)

pthread_once单例模式 - tom555cat - CSDN博客 (opens new window)

pthread_once()使用(某个时间在整个程序中仅执行一次,不确定是那个线程) - 轻飘飞扬 - CSDN博客 (opens new window)

23种设计模式对比与总结 - 码农恋码 - 博客园 (opens new window)

ORM框架使用优缺点 - public - CSDN博客 (opens new window)

高性能服务开发之定时器 - 行健 - 博客园 (opens new window)

Https协议详解 - CoderZhuang - 博客园 (opens new window)

图解SSL/TLS协议 - 阮一峰的网络日志 (opens new window)

HTTPS 原理解析 - Zery - 博客园 (opens new window)

Linux的用户和用户组管理 - 风生水起 - 博客园 (opens new window)

TCP系列13—重传—3、协议中RTO计算和RTO定时器维护 - lshs - 博客园 (opens new window)

可执行文件(ELF)格式的理解 - 深海的小鱼儿 - 博客园 (opens new window)

GCC/G++编译参数含义 - yasi_xi的专栏 - CSDN博客 (opens new window)

Linux内核中cache的实现 - leopard_ray的专栏 - CSDN博客 (opens new window)

epoll源码实现分析[整理] - Apprentice89 - 博客园 (opens new window)

linux内核内存管理学习之三(slab分配器) - 浩海拾贝 - CSDN博客 (opens new window)

深度理解select、poll和epoll - 傻眼哥的博客 - CSDN博客 (opens new window)

【经典算法】——KMP,深入讲解next数组的求解 - c_cloud - 博客园 (opens new window)

Linux中断(interrupt)子系统之一:中断系统基本原理 - DroidPhone的专栏 - CSDN博客 (opens new window)

HTTP Session、Cookie机制详解 - 奔跑的001 - 博客园 (opens new window)

HttpSession详解 - 别再顺其自然 - 博客园 (opens new window)

HTTP的长连接和短连接 - 烛秋 - 博客园 (opens new window)

自动化构建 - 百度 (opens new window)

linux内核之进程的基本概念(进程,进程组,会话关系) - 笨拙的菜鸟 - 博客园 (opens new window)

Linux--进程组、会话、守护进程 - Alex_Monkey - 博客园 (opens new window)

银行家算法学习笔记 - 唯心不易 - 博客园 (opens new window)

linux session 浅谈 - younghongjian的专栏 - CSDN博客 (opens new window)

Linux-进程、进程组、作业、会话、控制终端详解 - John_ABC - 博客园 (opens new window)

关系型数据库到文档型数据库的跨越 - 海天一色是黑色的博客 - CSDN博客 (opens new window)

linux系统编程之进程(八):守护进程详解及创建,daemon()使用 - mickole - 博客园 (opens new window)

数据库设计三大范式 - Ruthless - 博客园 (opens new window)

常见面试题整理--数据库篇 - 铭记遗忘 - 博客园 (opens new window)

谈谈数据库的ACID - 敦格 - CSDN博客 (opens new window)

关于TCP乱序和重传的问题 - cws1214的专栏 - CSDN博客 (opens new window)

DNS 原理入门 - 阮一峰的网络日志 (opens new window)

数据结构专题——线段树 - MetalSeed - CSDN博客 (opens new window)

一步一步理解线段树 - tenos - 博客园 (opens new window)

mysql 数据表读锁机制详解 - joy696163 - 博客园 (opens new window)

单例模式全面学习(C++版) - weixliu - 博客园 (opens new window)

单例模式及C++实现代码 - 曾经的你| - 博客园 (opens new window)

每天进步一点点——五分钟理解一致性哈希算法(consistent hashing) - Cynric 的博客 - CSDN博客 (opens new window)

TCP 协议中MSS的理解-frankzfz-ChinaUnix博客 (opens new window)

TCP/IP详解学习笔记(15)-- TCP的流量控制和拥塞控制 - newwy - 博客园 (opens new window)

TCP/IP详解--拥塞控制 & 慢启动 快恢复 拥塞避免 - losbyday - 博客园 (opens new window)

关于C++中公有继承、私有继承、保护继承的讨论 - This is bill的专属博客 - CSDN博客 (opens new window)

解决Hash碰撞冲突方法总结 - zeb_perfect的专栏 - CSDN博客 (opens new window)

Linux进程通信之POSIX共享内存 - anonymalias的专栏 - CSDN博客 (opens new window)

IPC对象持续性 - xiaohuima_dong的专栏 - CSDN博客 (opens new window)

Linux环境进程间通信(三):消息队列-hnsyspc-ITPUB博客 (opens new window)

Linux进程同步之POSIX信号量 - anonymalias的专栏 - CSDN博客 (opens new window)

进程/线程同步的方式和机制,进程间通信 - Icnblog_Wan - 博客园 (opens new window)

Linux进程同步之记录锁(fcntl) - jlins - 博客园 (opens new window)

Linux 伙伴算法简介 - 浩天之家 - 博客园 (opens new window)

孤儿进程与僵尸进程[总结] - Anker's Blog - 博客园 (opens new window)

Linux虚拟地址空间布局以及进程栈和线程栈总结 - Xzzzh - 博客园 (opens new window)

linux 内核poll/select/epoll实现剖析 - 在思考的路上 - ITeye博客 (opens new window)

Linux虚拟地址空间布局 - clover_toeic - 博客园 (opens new window)

HTTP详解(1)-工作原理 - guisu,程序人生。 逆水行舟,不进则退。 - CSDN博客 (opens new window)

epoll简介及触发模式(accept、read、send) - 留下的只是回忆 - 博客园 (opens new window)

linux内核分析笔记----中断和中断处理程序 - ☆&寒 烟☆ - 博客园 (opens new window)

标准IO与文件IO 的区别 - big_bit的博客 - CSDN博客 (opens new window)

硬中断和软中断 - zhangskd的专栏 - CSDN博客 (opens new window)

可重入和不可重入 - wenhui_的专栏 - CSDN博客 (opens new window)

浅谈数位DP - zbtrs - 博客园 (opens new window)

C++ Queues(队列)、Priority Queues(优先队列) - 面对现实,超越自己 - C++博客 (opens new window)

缓存淘汰算法--LRU算法 - 小程故事多 - ITeye博客 (opens new window)

Linux内核中内存cache的实现-yfydz-ChinaUnix博客 (opens new window)

socket编程中write、read和send、recv之间的区别 - petershina的专栏 - CSDN博客 (opens new window)

彻底学会使用epoll(六)——关于ET的若干问题总结 - feeman的专栏 - CSDN博客 (opens new window)

linux系统编程之进程(八):守护进程详解及创建,daemon()使用 - mickole - 博客园 (opens new window)

Linux IO模式及 select、poll、epoll详解 - 人云思云 - SegmentFault (opens new window)

select、poll、epoll之间的区别总结[整理] - Anker's Blog - 博客园 (opens new window)

树状数组彻底入门 - 半根毛线 - 博客园 (opens new window)

C++的new、delete及其内存管理 - Kelvin_Yan的专栏 - CSDN博客 (opens new window)

malloc 函数详解 - Commence - 博客园 (opens new window)

浅谈数据库查询优化的几种思路 - 六尺帐篷 - 简书 (opens new window)

硬中断与软中断的区别_Linux编程_Linux公社-Linux系统门户网站 (opens new window)

信号的基本概念、信号的产生以及阻塞信号 - 滴巴戈 - 博客园 (opens new window)

Linux信号(signal) 机制分析 - h13 - 博客园 (opens new window)

linux中断--LINUX中断机制与信号 - 鱼思故渊的专栏 - CSDN博客 (opens new window)

进程线程及堆栈关系的总结 - echoisland的专栏 - CSDN博客 (opens new window)

栈帧之深入理解c函数调用过程 - jelly_9的博客 - CSDN博客 (opens new window)

【经典数据结构】B树与B+树 - vincently - 博客园 (opens new window)

linux 物理内存和虚拟内存 - 百度 (opens new window)

C/C++函数调用过程分析 - as_ - 博客园 (opens new window)

胜者树与败者树 - whz_zb的专栏 - CSDN博客 (opens new window)

Epoll详解及源码分析 - 我有我的天空 - CSDN博客 (opens new window)

环回地址 - 百度 (opens new window)

拓扑排序的原理及其实现 - dm_vincent的专栏 - CSDN博客 (opens new window)

Manacher算法--O(n)回文子串算法 - xuanflyer - CSDN博客 (opens new window)

【转】二叉树、B树、B-树、B+树、B*树 - zhzhang - 博客园 (opens new window)

设计模式 之 单例模式 (C++ 懒汉经典实现 & DCL实现 & 饿汉经典实现) - 柠檬不加糖的博客 - CSDN博客 (opens new window)

C++中的单例模式 - Hackbuteer1的专栏 - CSDN博客 (opens new window)

【C/C++】对于可重入、线程安全、异步信号安全几个概念的理解 - ZhangPY的专栏 - CSDN博客 (opens new window)

B树、B-树、B+树、B*树详解(转) - 憨熊之家 - 博客园 (opens new window)

红黑树(一)之 原理和算法详细介绍 - 如果天空不死 - 博客园 (opens new window)

分布式锁的三种实现方式 - - ITeye技术网站 (opens new window)

平衡二叉树详解 - zhangbaochong - 博客园 (opens new window)

n个数中任意两个异或最大值 (opens new window)

+ + + diff --git a/blogs/inlove/frame_1.html b/blogs/inlove/frame_1.html new file mode 100644 index 0000000..84fbb22 --- /dev/null +++ b/blogs/inlove/frame_1.html @@ -0,0 +1,87 @@ + + + + + + 相处阶段-认识 (一) | 斯人如彩虹 + + + + + + + + + + + +

相处阶段-认识 (一)

5/22/2022 聊天

# 认识阶段

# 前言

​ 方法:同学同事 朋友介绍 搭讪 社交软件 相亲

​ 目的:多认识女生 明确合适的类型 防止死胡同

​ 注意:心态崩溃 很容易喜欢一个女生并上心 容易患得患失 这是所有不会追女生的共同点

​ 认识人主要三点:资源 展示面 方法 最重要的是资源

​ 主流认识途径: 社交软件 搭讪

​ * 社交软件是当下认识女生最快的途径

​ * 认识女生不代表不专一 而是要明确自己喜欢的类型

# 社交软件(探探 积木 soul等)

社交软件的关键:第一张照片(人帅 生活帅) 增加匹配率

如何用社交软件 要注意的细节

​ 第一张照片 做好 修一下 背景好 看清脸 后续兴趣爱好宠物 生活场景

​ 不要一直滑

​ 目的是要到微信 (可以说 我这个软件不常用 加个微信)

​ 不要聊太多

​ 不给就是没看上 下一个

​ 女生标注一上来就要微信的 都是老司机

​ 社交软件聊天不用太在意 要在意照片

​ 会员可以买

​ 不要发太多朋友圈

​ 资料认真填写

​ 照片可以约拍

​ 可以看其他竞争对手的照片

# 如何搭讪

也是一种提升和别人交流交往方式

主要是 状态 肢体语言 穿搭

搭讪的话术:

​ “我在这附近逛街看到你了 我想和你认识一下 留个微信吧”

​ 直接给

​ 犹豫害羞可以坚持一下:“我没有什么其他意思 就是想认识一下 你扫我一下”

​ 不想给:不强求

容易犯的错误:

​ 搭讪前不要被看到 从身后绕

​ 拍一下女生肩膀 同时说你好 要适中

​ 保持一米

​ 等对方看到你的眼睛后再开始说话

​ 说话要慢慢说

​ 不要有小动作

​ 真诚 不要油嘴滑舌

​ 有闺蜜的也要打招呼

三步:

​ 克服紧张 不在意女生是谁 只要不停的搭讪 不在意结果

​ 练习自己的说话和肢体语言

​ 尽量多的说话 能说多久说多久

+ + + diff --git a/blogs/inlove/frame_2.html b/blogs/inlove/frame_2.html new file mode 100644 index 0000000..398d585 --- /dev/null +++ b/blogs/inlove/frame_2.html @@ -0,0 +1,87 @@ + + + + + + 相处阶段-熟悉 (二) | 斯人如彩虹 + + + + + + + + + + + +

相处阶段-熟悉 (二)

5/22/2022 聊天

# 熟悉阶段

# 前言

​ 目的:让别人感觉你踏实 知道你是干什么的 大概是一个什么样的人

​ 注意:不熟悉属于无效聊天 可以适当幽默 不要想升高提升关系

​ 方法:真诚和踏实

要有目的的聊天 有目的的熟悉可以在十几分钟 不能无效聊天 女生放下手机 还能想起是什么人 建立基本的安全感 是个正常人 对我们有了关注 会看朋友圈

熟悉的三要素:

​ 让女生感觉到你说一个什么人(IT 宅男 文艺 工科男 工科男 创业者)印象 把感觉给到女生 大概是什么人

(我们班有个同学 特别调皮 成绩也还不错 这学期和别人打了三次架 是老师办公室的常客)

​ 大概了解她是什么人 做什么工作 多大年纪 有什么学历 了解基本信息 深入聊天

​ 聊聊女生感兴趣的话题 好吃好玩 明星综艺八卦

安全感的基础

​ 让别人感觉你踏实 知道你是干什么的 大概是一个什么样的人

# 第一次聊天的步骤 踏实 稳重

​ 寒暄 吃了吗 衣服好看 (刚下飞机 累死了 躺床上 抽根烟 休息一下)

​ 拉好聊氛围 老朋友 熟悉的气氛 搞笑的表情包 幽默开场白 一两句就行

​ 你好 正经正经 幽默对幽默

​ 朋友圈找信息 生活故事 表示自己状态 阳台吹风

​ dhv 高价值 有价值的地方 留下印象

​ 快速的自我介绍

​ (我是有个心理咨询师 别人情感 的 曾经有一个学员 找我心理辅导 停不下来了怎么这么的)

​ (我是有个程序员 出差半年的程序员)

​ 有趣的事情

​ dhv 不要说消极描述工作两点一线 说工程师 喜欢爱好 稍微包装

​ 信息互换

​ 不能问太多 最多三个

​ 问核心问题 先说自己 再问别人

​ 职业 年龄 学历 城市地域 了解大致是什么人

​ 说话要圆润一点 (你多大啊 我感觉 我比你大 ) 前面可以不问名字

​ 女生感兴趣的话题

​ 男生和女生基本没有共同话题的

​ 聊女生感兴趣的话题 朋友圈 星座八卦 吃的 玩的 宠物明星

​ 要有情绪的互动 找到感兴趣的点 或者共通的话题

​ (看到小孩 可以夸可爱 问为什么乖 激发分享欲)

​ 聊热点信息

+ + + diff --git a/blogs/inlove/frame_3.html b/blogs/inlove/frame_3.html new file mode 100644 index 0000000..3ff0e55 --- /dev/null +++ b/blogs/inlove/frame_3.html @@ -0,0 +1,87 @@ + + + + + + 相处阶段-吸引 (三) | 斯人如彩虹 + + + + + + + + + + + +

相处阶段-吸引 (三)

5/22/2022 聊天

# 吸引阶段

​ 吸引:吸引是女生愿意和你接触的原神动力 能配得上对方

​ 外形 价值 情绪三个吸引

​ 目的:让对方知道你是个猎人 优秀有能力的人 (事业成功 社交圈广 朋友多 物质条件优秀 自身条件好 生活有品位情调)

​ 注意:无吸引无追求 靠吸引而不是靠追

​ 方法:吸引就是高价值展示 做两种感觉被撩与害羞

# 猎人 有能力的男人 有高价值的男人

​ 繁衍价值

​ 高帅 身体强壮健康 年轻女生更喜欢高帅 大一点的喜欢有能力的

​ 生存价值

​ 外在 车房钱

​ 内在 优秀男人的特质 拼搏 进取 乐观 不屈不挠 有智慧 有内涵 有知识

怎么做

​ 高价值展示 朋友圈 工作生活兴趣爱好 展现自己的价值

​ 见面的形象 语言

建立吸引后下一步

​ 确认建立吸引 服从性测试 要电话 要照片 打电话起床

无吸引无追求

​ 没有建立起吸引的时候 暴露需求感会减低女人的吸引

​ 不要追求的事

# 吸引的两种感觉 什么是两种感觉 TF 暧昧聊天

​ 被撩的感觉BL 害羞的感觉FS

​ 撩BL 有好感才做 反馈一般的一点点 反馈不好的不要撩

​ 害羞FS 只能对反馈好的女生做

​ 做到想象 情景 有代入感 (和我谈恋爱的感觉一定很幸福吧)

# 吸引的形象 想象就是繁育价值

​ 第一印象很重要 类似投简历时的学历 形象判断人

​ 形象判断一个人的价值

​ 发型 穿着 肢体语言

​ 大众点评大店 根据脸型做一个发型 拍个照片照样子剪

​ 定型喷雾 发蜡 发胶 约会准备

​ 护肤 洁面 水乳

​ 服装 小红书

​ 模仿偶像 胡歌 和自身身份相符的

# 吸引的展示面

​ 昵称 头像 前面 墙 朋友圈

​ 昵称 不要非主流

​ 头像不要 风景照 证件照 宠物 卡通 网图 画质差照片

​ 任务缩小 视觉中心不要人物而是环境 网红背景 不要全脸要神秘

​ 朋友圈封面 广告位

​ 不要 网图 大头自拍 不要旅游照 风景照 要展示价值 品质生活照

​ 签名 有内涵

​ 朋友圈 不要转发鸡汤 没有自己的生活 纯文字 优秀的朋友 环境

​ 不要工作广告分组转发 专业的东西

​ 美食 娱乐生活 上进 愿意投资自己的人 宠物和小朋友也是好的

​ 和很多别的女性朋友照片 努力工作

​ 朋友圈配文 要少

​ 音乐分享

​ 门面 社交软件第一印象

​ 展示面是自己的窗口 名片 不是日记本

​ 社交软件 展示出来的状态

​ 展示面差女生一开始就不想聊了

​ 展示面是吸引的关键

​ 看朋友圈的几秒抓住女生

​ 做好头像和背景墙

​ 头像 不要用明星宠物

​ 要用自己的真是照片 露出正脸 发型 表情 独照 半身照 背景简洁

​ 背景图 全身照 环境不错的地方

​ 多角度展示自己的高价值

​ 看到自己的价值 要有自己的生活 接触有意思的东西

​ 展示面照片 工作 兴趣 生活 一定要展现自己的正能量 对生活的热爱

​ 看小红书这么拍生活照

​ 精致的生活 高价值的圈子 不要过多散发多愁善感

​ 不要发负能量的东西

+ + + diff --git a/blogs/inlove/frame_date.html b/blogs/inlove/frame_date.html new file mode 100644 index 0000000..bc4d835 --- /dev/null +++ b/blogs/inlove/frame_date.html @@ -0,0 +1,92 @@ + + + + + + 相处阶段-约会 | 斯人如彩虹 + + + + + + + + + + + +

相处阶段-约会

5/22/2022 聊天

# 约会

​ 关键的约会牵手S1 亲吻S2

# 注意流程和场地选择

​ 约会中的好感:场地40% 见面前的反馈30% 约会中的30% (失败的外部应数是很大的)

# 阶段

​ 第一次约会去互动性强的地方好玩的地方 场地逼格要高 环境好

​ S1 好玩的地方文艺的环境好

​ S2 文艺的环境好 半私密空间

# 转场很重要 一定要转场 最好三次 充实

​ 第一次 奶茶店 餐厅聊天半小时 吃饭

​ 第二次 娃娃机 电玩 旋转木马 互动的地方

​ 第三次 电影院 聊天

# 约会需要提前了解

​ 约会的场所 目的

​ 哪里的东西便宜好吃 环境好

​ 哪里适合牵手逛街

​ 哪家私人影院

​ 哪心情不好适合坐一坐的小河边

​ 哪家清吧价格不贵音乐好听 逼格还挺高

​ 哪里的娃娃机很新 娃娃好看 放机器的商场很高档

​ 哪里的艺术展 最近有什么

​ 哪里的阳光好的咖啡厅吗

​ 不要随便找 要花点心思 大众点评 小红书 实际看一下

​ 地道的小吃 便宜还好吃 没来过

​ 好玩的 娃娃机 碰碰车 划船 烧烤 风筝 郊游 农家乐 温泉 鬼屋 密室 桌游 电影 唱歌机 酒吧 ktv 水上乐园 游乐场 游泳池

​ 文艺的 陶艺学习 双人烘焙 手工 艺术展 绘画体验 情人坡 情人湾 宁静小河边 艺术社区 图书馆 私人影院 旋转木马 摩天轮 清吧 踩单车 羽毛球馆 散步 跳舞

​ 有逼格的 网红下午茶 咖啡厅 骑马 高尔夫 五星级酒店走廊 旅游

​ 小红书 下午茶 骑马 卡丁车

# 约会可以的流程

加上微信后聊天不要超过三天 年龄 兴趣 爱好 工作
+第一次 咖啡馆 奶茶店 看外貌 谈吐气质 了解思维方式和表达能力 感觉不错再去吃饭 +第二次 去游乐场和密室 看应变能力 对未知项目的开拓 +第三次 去打羽毛球 或其他运动 看默契程度 +第四次 去博物馆 去一些文创类地方 看品味和审美 +第五次 看消费观 帮对方挑选衣服

+ + + diff --git a/blogs/inlove/this36question.html b/blogs/inlove/this36question.html new file mode 100644 index 0000000..a560f87 --- /dev/null +++ b/blogs/inlove/this36question.html @@ -0,0 +1,160 @@ + + + + + + 相处阶段-亚瑟·阿伦三十六问 | 斯人如彩虹 + + + + + + + + + + + +

相处阶段-亚瑟·阿伦三十六问

6/4/2022 聊天

# 亚瑟·阿伦三十六问

1、在这个世界上,如果你可以选择一个人跟你共进晚餐,你会选择谁?

2、你有想过出名吗?通过什么方式?

3、在打电话前,你一般会练习怎么去表达吗?为什么?

4、你觉得在你的心里,完美的一天是什么样子?

5、你上一次一个人唱歌是什么时候呢?对其他人唱歌呢?

6、假设你可以活到90岁,那么在30岁后,你更倾向于身体年轻还是思想年轻,来躲过余下的60年呢?

7、你对你以后怎样死去,有没有预感?

8、说一下我们的三个共同点。

9、你这辈子最感激的是谁,或者是什么事?

10、如果你能改变你过去的经历,你想改变那件事?

11、用四分钟,尽可能详细的讲讲你从小到大的经历。

12、如果你明天醒来会获得一种新的才能,你希望是什么。

13、如果水晶球能告诉你关于你自己、你的生活、未来或其他任何事情的真相,你希望知道什么?

14、有没有长时间梦寐以求的事情,为什么你没有去实现?

15、你觉得自己最成功的是什么?

16、你觉得有用最珍贵的地方是什么?

17、你最宝贵的记忆是什么?

18、你最可怕的记忆是什么?

19、假设一年后你会突然去世,那么你会改变现在的生活方式吗?为什么?

20、友谊对于你来说意味着什么?

21、爱情和喜欢,在你生活中大概是什么样的角色?

22、说出5个关于我的好的特质。我也说5个关于你的。

23、你家里人之间亲密吗?你是不是觉得你的童年比其他大多数人更幸福?

24、你觉得你和你密码的关系是怎么样?

25、各种做三个围绕“我们”的事实陈述。例如,“我们在深夜一起聊天”。。。

26、给你一句句子,你把它补全:”我希望能有人和我一起分享。。。“

27、如果你要和我成为球迷的朋友,对你来说,最需要知道关于我的事情是什么?

28、告诉我你喜欢我什么;这次要非常诚实哦。

29、和我分享一件生活种令你尴尬的事情,可以是最近的事情。

30、你上次在别人面前哭是什么事情?那独自流泪是什么时候呢?

31、告诉我,我有哪些地方已经放你开始喜欢上了。

32、对你来说,有没有一些事严肃道不能开玩笑?

33、假设你今晚就要死了,而你再也没有机会和其他人甲流,那你最后悔没有告诉别人什么事?为什么还没有告诉他们。

34、你的房子着火了,你的所有东西都在里面,在救出你的亲人和宠物后,你有时间进去最后一次冲进去安全的救出最后一件物品,那将会是什么?为什么?

35、在你所有家人中,谁的离去最令你痛苦,为什么?

36、说一个你自己私人遇到的困扰,你说完我也说我的,然后我们互相给对方想办法。

# 话题互相了解对方

吃过最好吃的东西是什么 +目前最想做的事 +最想和对方做的事 +两个人的共同爱好 +讨论自己的兴趣爱好 +谈谈对方性格中的缺点 +最喜欢对方的哪—点 +遇见对方前是什么状态 +聊一聊初见对方的印象 +做过最让对方感动的事 +做过最浪漫的事 +做过最蠢的事 +生气时怎么解决问题 +对方最不好的习惯 +最欣赏对方的一点 +经历的最开心的事 +普及自己的兴趣爱好 +分享喝多后做过的糗事 +分享自己的旅行经历 +分享自己内心的小秘密 +分享做过最尴尬的事 +分享每天发生的趣事 +吐槽工作的烦恼 +最讨厌吃的东西是什么 +最喜欢的歌手是谁 +印象最深刻的一件事 +在一起后的幸福瞬间 +聊聊儿时的梦想 +儿时的学习状况 +最喜欢的动画片 +最怕的东西是什么 +想要拥有什么样的超能力 +疲惫的时候怎么放松自己 +当你陷入困境时你会向谁请教 +因为什么事情跟父母吵过架 +人生目前最大的成就是什么 +最近一次哭是什么时候为什么 +小时候的梦相是什么 +喜欢独处吗 +如果中了500万,你会怎么规划 +如果你打算写本书,你会写什么内容 +单曲循环最久的歌是哪一首 +想唱给对方的歌 +分享彼此的奇葩朋友 +遇到最难忘的囧事 +小时候怕爸爸还是妈妈 +我做过哪件事情让你很生气你 +是如何察觉我在生气的 +最喜欢吃的一道菜 +最想去哪个地方 +我让你难堪过吗 +喜欢什么游戏/音乐/电影/花/水果

9.你对彼此忠诚的定义是什么? +10.给爱情下个定义? +11.浪漫的度假作为你生活方式的一部分,你有何感受? +12.你会因为一个什么样的小细节而对—个女人动心? +13.你认为钱最主要的功能是? +14.在什么样的情况下,你会放弃原则? +15.你曾犯下的最大的措误是什么?它是如何改变你人生的?

# 暧昧阶段

这个阶段往往有过务次约会,彼此都有想进步的起法,再通过相对私密话题了解对方对感情的态度,否是合适的人? +9.你喜欢什么样的工作环境? +10.你最欣赏什么样的人? +11.是否对自己的工作满意? +12.喜欢独处么? +13.平常去哪儿玩? +14.最想去哪个城市工作? +15.当你对某人有偏见时,你是怎么想的? +16.你最好的脆友是谁?为什么? +17.你是如何选择现在这项事业的?

# 恋爱阶段

如果以上话题你都史经解锁成功,而说明你们的关系就基本可我确定下来,接下来就是好好读恋爱培养感情让关系 +更稳定 +1.告诉我,你是何时发觉爱上我的? +2.如果我想在生日.上给你一个惊喜.你希望是什么? +3.你想要的完美爱情是什么样的? +4.的有想过你30岁之后的人生会是什么样子么? +5.我会是你值得信任的人吗? +6.如果金钱不再是目标.你最大的追求会是什么?

Last Updated: 11/12/2023, 5:00:07 PM
+ + + diff --git a/blogs/mianjing/duoyi.html b/blogs/mianjing/duoyi.html new file mode 100644 index 0000000..2dd0886 --- /dev/null +++ b/blogs/mianjing/duoyi.html @@ -0,0 +1,87 @@ + + + + + + 多益网络面经 | 斯人如彩虹 + + + + + + + + + + + +

多益网络面经

12/15/2020 面经

22020年09月18日星期五16:52:45 CST

1、做个简单的自我介绍

2.这个项目都是多少个人做的?

3.后端就你一个人做的吗?

4.项目做了多久?

5.说一说项目中困扰你时间比较长的问题?

6.项目中你试花在搭建环境的时间比较长是吗?(我说了很多关于服务器代码是如何实现的,原理是什么)

7.用了2个nginx具体是如何做高可用的

8.2个nginx都是回同时使用的吗?还是只是使用其中一个

9.用的2个ip给前端使用是吗?部署在不同的机器上面吗?

10.有了解过,用一个ip可以使多个nginx相互切换,例如其中一个nginx异常,是要访问另外一个ip是吗

11.有了解过虚拟ip这个东西呢?

12.nginx配置的是用什么样的负载均衡算法?

13.有了解过哪些负载均衡算法呢?

14.知道nginx是如何做负载均衡的吗?(我提到nginx中的线程池和epoll )

15.服务器是如何在多个副本中进行数据同步的?

16.知道原理细节吗?

17.现在的部署下,在什么故障下,服务器能够正常使用?

18.只实现了读的高可用,写方面没有实现高可用是吗?

19.fastdfs在写数据上能不能也做高可用?

20.有没有了解过其他分布式存储的东西呢?(我说对网络编程,tcp,网络的原理会熟悉一些)

21.什么情况下做东西线程通信?

22.单线程非阻塞有什么问题吗?

23.让你设计一个网络工具,你会用多线程同步阻塞的方式吗?

24.说一下你对epoll的了解?

25.说一下select的区别?

26.什么情况下适合用select,什么情况下适合使用epoll ?

27.为什么1024个连接的时候适合用select ?

28.为什么你认为select适合做1024个以下的连接?

29.平时select和 epoll都有写过吗?(我提到reactor)

30.说一下reactor和preactor的区别?

31.先说一下select是不是reactor ?

32.你是说epoll是同步的方式,reactor是异步的方式吗?

33.reactor这个概念你是从哪里了解到的?

34.一般搜索东西是在哪里搜索?

35.直接上csdn上面搜索吗?

36.为什么不直接用google搜索吗?是因为csdn上面搜索的东西比较适合你看吗?

37.你用epoll是来实现个什么东西?是应用还是练习?

38.关于epoll中处理数据的时候,你是如何处理的?

39.epoll的边沿触发和水平触发了解吗?

40.在使用上你是如何用边沿触发还是水平触发的?

41.如何设置边沿触发和水平触发的?

42.数据处理上是如何设计的?

43.以前有写过聊天室之类的通信呢?协议是如何设计的?

44.聊天室是你大学的时候做的吗?

45.你写socket变成的话,你试如何处理这些接口的错误的?

46.recv返回-1的话就是错误吗?

47.工作中为什么要用redis做这个token呢?

48.redis有了解过是如何做持久化的呢?

49.redis数据结构有了解哪些呢?

50.有序的set是如何实现的?

51.在这个公司还有别的工作体现你的水平的东西吗?

52.看你有用mmap,说一下mmap是什么?

53.你觉得哪些场景可以用mmap ?(我说了开发板的屏幕映射)

54.做软件开发的时候什么时候会用到mmap ?(我说了netmap用户态协议栈)

55.共享内存有了解过吗? linux一般如何去实现共享内存的?(shm)

56.你的主要开发语言是c/c是吧?平时写c多还是c ?

57.c11了解吗?平时你们使用的是c11吗还是老版本?

58.智能指针有了解吗?(我说 auto ptr ,unique ptr , shared ptr , weak ptr )

59.说一下上述智能指针的区别?

60.平时有用过哪一些指针?

61.C++里面右值引用什么意思?

62.多态是如何实现的?核心原理是什么?

63.你们平时如何去定位内存泄露的问题?

64.你是基本只做c/c++语言是吧?

65.第一家公司是做什么工作的呢?

66.你为什么会选择离开第一家公司呢?

67.为什么会离开第二家公司呢?

68.为什么毕业的时候会选择第一家做机顶盒的公司呢?

69.毕业找工作的时候有其他的offer选择呢?

70.大学的时候就是做嵌入式吗?

71.那你对游戏行业有了解过吗?了解多少?

72.你为什么会投游戏行业呢?对游戏后台了解吗?

73.对音视频哪些了解过吗?

74.平时玩游戏吗?

75.你现在找工作是只要是后端就可以是吧?游戏后端可以?音视频后端?服务器后端?都是有兴趣的是吧?

76.平时会通过什么样的途径去学习呢?

77.你平时一般看书多—些呢?还是上网看博客,看视屏多一些?

78.你最近在学的是什么呢?(我说有在学用户态协议栈的一些东西,netmap

79.是指tcp/ip协议吗?http协议哪些吗?(我大概说来一下netmap的原理)

80.说到拷贝的话,0拷贝这些有了解过吗?

81.还有了解到别的0拷贝的应用吗?

82.你现在工作是要加班吗?几点到几点?(每天都是10点,11点以后)

83.你们业务开发很多吗?你一般事情做完了会是几点?你对工作时间是如何看的?

84.长期10点多和11点多下班的话,个人能坚持吗?能接受吗?

85.平时周末或者节假日突然需要修bug的时候有吗?

86.你现在有女朋友吗?在那里?

87.你是哪里人?你现在在广州哪里?

88.你了解过我们公司的位置吗?

+ + + diff --git a/blogs/mianjing/sangfor.html b/blogs/mianjing/sangfor.html new file mode 100644 index 0000000..a9d2db5 --- /dev/null +++ b/blogs/mianjing/sangfor.html @@ -0,0 +1,87 @@ + + + + + + 深信服面经 | 斯人如彩虹 + + + + + + + + + + + +

深信服面经

12/15/2020 面经

深信服网络安全2020年09月14日星期一12:47:05 CST

1.简单的介绍一下自己擅长的技能

2.工作中主要还是做c/c++是吗?json也是用c/C++写的吗?

3.c/C+ + static的使用场景是什么?

4.C++为什么要使用extern C ,才能调用c文件的内容?<

5.定义局部数组和直接使用new/malloc分配的内存有什么不一样?

6.栈上面分配数组最大可以分配多少内存?

7.free/delete是如何知道需要释放的内存段有多大?◆

8.空指针和野指针的区别?

9.场景, 2个线程分别有2个指针, p1, p2 ,都指向了同一-片内存,现在释放掉p1 ,内存已经被释放了,但是现在p2也要释放内存, 这个时候会出问题吗?怎么解决? ( 引用计数,互斥锁,无锁cas

10.通常计算字符串长度使用strlen , sizeof能计算字符串的长度吗?

11.算法题,判断一个数是否是2的n次方

12.进程和线程的区别

13.案例题,你需要综合考虑;多核cpu场景,使用多线程的场景去设计数据的手法,数据的计算,整体协调的效率达到最大。简单的当做网络接口的接收和

发送 epoll 线程池 协程

14.tcp和udp的区别

15.socket套接字变成,服务器端都有哪些函数,功能是什么

16.网络编程,网络协议栈有没有了解

17.类似于epoll这样的技术,你是如何学习的?

18.除了c/c+ +平时还接触其他语言吗?

19.go语言有接触过吗?

深信服二面2020年09月16日星期三14:33:02 CST

1.用什么语言来做的这个服务器?

2.(啊?怎么用c/c+ +来做? )并发能有多少?

3.我觉得20w比较悬,能做到20w并发不太可能

4.有没有做断点续传的功能,闪存(秒传)的功能,如何做的?

5.你们是提供给别人sdk吗?

6.如何验证文件的md5值,细节?

7.如果用http chunk编码的方式如何做?

8.全部都用你的客户端上传文件,你没有办法控制文件的格式和安全的?

9.浏览器想去在线打开你的文件,你为什么不支持chunk编码的方式?

10.你理解http的chunk编码吗?

11.鉴权如何做,用户权限是如何做的?

12.上传文件带了哪些验证信息,具体技术实现细节?

13.上传文件,二进制流你也是放在json里面吗?

14.我是黑客的话就不按你的流程走,直接把文件传到你的服务器里面,这个怎么办?

15.token是明文的话,很容易被别人拿到,这个是很不安全的,如何处理?

16.token的做法,文件上传的做法,需要说的更加清楚和细节-一些

17.这样做不行,如果不对上传文件做校验的话,这样做是有问题的,是存在漏洞的

18.http明显有一个auth的字段为什么不用 ,你现在做的这样是不合理的

19.你还有做过其他的一一些项目吗,互联网的

20.有做过linux内核网络层的项目开发吗?

21.网络通信这一块有别的项目经验吗?自己去做的scoket项目有吗?

22.socket阻塞和非阻塞有什么区别?如何写?

23.recv返回-1有哪几种情况要处理?

24.看你还做了linux内核移植的,是做过内核的编程呢还是编译?

25.有把哪一一个开源技术研究的比较深的经历吗,搞的比较透的那种?

26.做的项目过程中,有没有遇到最困难,最难查的bug ,如何解决的?我是要看你解决问题的深度

27.你说的这些都是基本的调试技术,这是必须会的,你有让你印象比较深刻的很难的

28.你看下你那边还有什么项目可以证明你能力的?

29.你在网络这一块相对比较有经验-点对吧,网络编程这一块

30.有兴趣学其他的语言吗?比如go语言, python语言

31.介绍一些你过往比较快学习- 一个技术且掌握的案例吗?

32.有看过哪些书籍?看看你的学识能力

我问的问题

1.这个岗位核心技能是网络相关的技能还是安全的技能

●大部分主要还是网络这一块的,对内核的编程要有一些了解,应用层的编程也是需

●刚才和你说的chunk编码类似的会用到openssl做加密,你对openssI有了解过吗

●要对网络层的各种协议要搞的很熟,例如gre ,例如unix网络编程, tcp/ip详解

+ + + diff --git a/blogs/other/guide.html b/blogs/other/guide.html new file mode 100644 index 0000000..5c1bc38 --- /dev/null +++ b/blogs/other/guide.html @@ -0,0 +1,97 @@ + + + + + + vuepress-theme-reco | 斯人如彩虹 + + + + + + + + + + + +

vuepress-theme-reco

4/9/2019

vuepress leancloud-storage valine

介绍

  1. 这是一个vuepress主题,旨在添加博客所需的分类、TAB墙、分页、评论等能;
  2. 主题追求极简,根据 vuepress 的默认主题修改而成,官方的主题配置仍然适用;
  3. 你可以打开 午后南杂 (opens new window) 来查看效果。

# Use

Build

npm run build
+
+# or
+
+yarn build
+
1
2
3
4
5

Server

npm run dev
+
+# or
+
+yarn dev
+
1
2
3
4
5

# Play Together

# 0.x

vuepress-theme-reco@0.x 是基于 vuepress@0.x 的博客主题。

vuepress@0.x 功能比较简单,只适合书写简单的文档,但好在支持主题自定义,而个人又希望能够用它来书写博客,原因就是它足够的简洁,毫无疑问,这也符合很多程序员的观念,也就是在这种情况下,vuepress-theme-reco@0.x 的第一个版本经过一个通宵而产生。

主题开源不久,很多朋友通过各种联系方式,给到很多好的意见和建议,所以我个人也在积极地更新。

因为我是一名前端开发工程师,开发的过程中,总是想着能不能加入一些炫酷的效果,有很多次都是添加上又去掉,反反复复,最后都是被 简洁 的这个原则阻止掉,毕竟,现在我是将它当作一个产品来看待,并不是一个技术或者是技巧的尝试项目。

# 1.x

随着不断有用户过来询问:为什么 vuepress-theme-reco@0.x 不能在 vuepress@1.x 上使用?本来只是打算对 vuepress-theme-reco@0.x 进行简单的bug修复的我,终究还是忍不住,开始了 vuepress-theme-reco@1.x 的开发。又是在一个寂静的凌晨两点半(晚上就是出活快),我默默地开始了。

主题升级的关键也就是 @vuepress/plugin-blog 这款官方插件,它不需要再去麻烦地过滤数据,将分类和标签的相关信息直接存在 $categories$tags 这两个全局变量中。借助于 @vuepress/plugin-blog,分类和标签功能更容易实现,但也有了一些局限。接下来两三天的时间,都是在进行功能的迁移和一些bug的修复。

vuepress-theme-reco@0.x 的开发中,更加深刻地明白了模块化和组件化编程的重要性,如果当初没有把一些功能进行封装,而是直接简单的复制,这次升级也不会这么顺利。模块拆分的越细,使用就会越灵活。

# CLI

还是衷心地希望能有更多的朋友参与进来,更快地去完善它。接下来时间允许的情况下,我会开源一款自动生成博客的脚手架,略过配置步骤,直接书写优质内容,这也是我后来逐渐形成的一种信念,就是希望能让这款主题,功能越完善,使用越来越简单。

# License

MIT (opens new window)

+ + + diff --git a/blogs/other/markdowngrammar.html b/blogs/other/markdowngrammar.html new file mode 100644 index 0000000..cfe24fb --- /dev/null +++ b/blogs/other/markdowngrammar.html @@ -0,0 +1,100 @@ + + + + + + markdown语法 | 斯人如彩虹 + + + + + + + + + + + +

markdown语法

5/27/2022

# 一级标题

# 二级标题

# 三级标题

# 四级标题

# 五级标题
# 六级标题

斜体文字

斜体文字

粗体文字

粗体文字

粗斜体文字

粗斜体文字

分割线






删除线

baidu.com +sina.com +tencent.com

带下划线文本

[^要注明的文本]:

  • 第一项
  • 第二项
  • 第三项
  • 第一项
  • 第二项
  • 第三项
  • 第一项
  • 第二项
  • 第三项
  1. 第一项: +
    • 第一项嵌套的第一个元素
    • 第一项嵌套的第二个元素
  2. 第二项: +
    • 第二项嵌套的第一个元素
    • 第二项嵌套的第二个元素

最外层

第一层嵌套

第二层嵌套

'print()' 函数

代码区块

'''javascript +$(document).read(function(){ +alert('Markdown'); +}); +'''

链接名称 +或者 +<链接地址>

这是一个链接 新浪新闻 (opens new window) https://news.sina.com.cn/ (opens new window)

有问题上知乎 图标

表头1 表头2
单元格11 单元格12
单元格21 单元格22

使用Ctrl+Alt+Del重启电脑

文本加粗 +**正常显示星号**

$$ +\int_0^1 {x^2} ,{\rm d}x +$$

+ + + diff --git a/blogs/technology/redis/092101.html b/blogs/technology/redis/092101.html new file mode 100644 index 0000000..e100e18 --- /dev/null +++ b/blogs/technology/redis/092101.html @@ -0,0 +1,87 @@ + + + + + + second page in category1 | 斯人如彩虹 + + + + + + + + + + + + + + + diff --git a/blogs/technology/redis/121501.html b/blogs/technology/redis/121501.html new file mode 100644 index 0000000..a63b87a --- /dev/null +++ b/blogs/technology/redis/121501.html @@ -0,0 +1,87 @@ + + + + + + first page in redis | 斯人如彩虹 + + + + + + + + + + + + + + + diff --git a/blogs/technology/zmq/121501.html b/blogs/technology/zmq/121501.html new file mode 100644 index 0000000..7e32d7c --- /dev/null +++ b/blogs/technology/zmq/121501.html @@ -0,0 +1,87 @@ + + + + + + first page in zmq | 斯人如彩虹 + + + + + + + + + + + + + + + diff --git a/blogs/work/ability.html b/blogs/work/ability.html new file mode 100644 index 0000000..765e8b8 --- /dev/null +++ b/blogs/work/ability.html @@ -0,0 +1,87 @@ + + + + + + T级职业等级标准 | 斯人如彩虹 + + + + + + + + + + + +

T级职业等级标准

1/3/2021 工作
知识点 能力范畴 职级/是否要求
初级 中级 高级
T1 T2 T3 T4 T5 T6 T7 T8(T2.3) T9(T3.1)
语言 开发环境搭建、运行第一个hello word 代码能力
运用基本数据类型、表达式与操作符进行简单开发 代码能力
字符串、向量和数组 代码能力
语句和函数 代码能力
分支控制、循环 代码能力
对象生命周期 & 垃圾回收 代码能力
错误和异常处理 代码能力
标准库使用 代码能力
日志分析、断点调试等简单代码调试方法 代码能力
面向对象设计原则 代码能力
单例模式、工厂模式等简单的设计模式 代码能力
gdb高级调试技巧和常用系统分析工具使用 代码能力
适配器模式、代理模式等常见设计模式 代码能力
创建型、结构型、行为型设计模式的应用技巧 代码能力
代码耦合的产生原因和规避方法 代码能力
数据结构和算法 初识数据结构和算法 - 冒泡排序 代码能力
数组、列表、栈,队列等基本线性数据结构 代码能力
递归、排序、二分查找算法 代码能力
跳表、散列表、hash算法 代码能力
二叉树、红黑树 代码能力
堆排序、归并排序、二分查找等高阶算法 代码能力
字符串匹配、KMP算法 代码能力
熟悉图论算法:dijkstra算法、最小生成树、深度优先搜索等 代码能力
贪心算法、动态规划 代码能力
能够分析算法的执行效率和资源消耗、时间和空间复杂度分析 代码能力
能够根据实际场景,选用合适的数据结构和算法进行程序设计 代码能力
数据库 MySQL服务器的安装与配置 代码能力
数据表的新建、查询和删除操作 代码能力
标准语言SQL和CURD能力 代码能力
表、主键、索引、视图 代码能力
表结构设计规范 代码能力
事务的使用以及其ACID特性 架构能力
不同存储引擎的区别 架构能力
事务的隔离级别和实践原理 架构能力
数据库的连接池管理 架构能力
数据库的权限管理 安全能力
SQL注入、web shell攻击的危害和规避方法 安全能力
数据库的集群和高可用 架构能力
SQL语句优化、索引和参数调优 运营能力
运用Redis进行数据缓存处理,提高系统性能 架构能力
redis内存模型 架构能力
redis的持久化、主从同步以及集群 架构能力
网络原理 利用ping、ifconfig、telnet等命令查看计算机网络状况 代码能力
网络体系中每一层的作用和基本协议 代码能力
TCP和UDP的基本原理 代码能力
http协议基础与应用 代码能力
TCP协议的可靠传输机制 代码能力
TCP协议的流量控制和拥塞控制 代码能力
Session、Cookie 与 Application 代码能力
网络安全的加密算法与数字签名 安全能力
https协议的基本原理 安全能力
http2.0与http3.0特性 架构能力
XSS攻击的危害和规避方法 安全能力
Wireshark、tcpdump等网络抓包工具使用和结果分析 代码能力
网络故障分析与问题解决 运营能力
操作系统 常用的文件、目录操作命令使用 代码能力
程序的编译与运行 代码能力
shell脚本与vi使用 代码能力
linux系统性能监控命令的使用 代码能力
线程、进程的概念、创建与调度 代码能力
用户态和内核态的基本概念、区别 代码能力
CPU的上下文切换、中断处理与系统调度 代码能力
磁盘文件系统、虚拟文件系统与文件缓存 代码能力
物理内存和虚拟内存 代码能力
进程间通信机制 代码能力
死锁的危害、出现原因、解决方法 安全能力
内存溢出、内存泄漏的原因与解决 安全能力
如何高效利用CPU缓存 架构能力
内存问题分析与性能优化 架构能力
磁盘 I/O 性能优化 架构能力
系统网络性能评估与优化 架构能力
网络编程 利用socket编程编写简单客户/服务器程序 代码能力
基本TCP/UDP套接字编程 代码能力
五种常见I/O模型 代码能力
I/O多路复用技术 代码能力
time_wait、close_wait状态产生的原因、危害与避免方法 安全能力
熟练掌握各种I/O模型的运用场景 代码能力
掌握C10k问题的基本解决方案 架构能力
网络框架学习 架构能力
分布式架构 简单rpc协议设计和框架搭建 架构能力
rpc的服务寻址、数据流的序列化与反序列化和网路传输 架构能力
分布式事务的学习 架构能力
一致性算法 架构能力
分布式锁的设计与实现 架构能力
主流的微服务rpc框架 架构能力
服务注册、服务发现 架构能力
分布式trace、监控告警 运营能力
负载均衡 架构能力
主流分布式系统架构设计,比如分布式缓存、API网关、分布式消息组件 架构能力
分布式系统的缓存设计、缓存雪崩、缓存击穿等现象 架构能力
容灾保护、降级熔断、流量控制、故障隔离、故障恢复 架构能力
分布式架构的高并发、高可用、可扩展 架构能力
云原生 Docker原理与搭建 架构能力
Kubernetes 架构能力
容器编排、容器网络 架构能力
集成构建 架构能力
云上常见的SaaS服务和组件 架构能力
弹性扩缩容 架构能力
服务网格Istio和Serverless 架构能力
软技能 需求分析 工程素养
项目设计方法 工程素养
项目流程管理 工程素养
项目风险控制 工程素养
跨部门合作 工程素养
沟通技巧 工程素养
组织协调 工程素养
目标管理 工程素养
+ + + diff --git a/blogs/work/ability1.html b/blogs/work/ability1.html new file mode 100644 index 0000000..c1b58b1 --- /dev/null +++ b/blogs/work/ability1.html @@ -0,0 +1,87 @@ + + + + + + T级职业等级标准1 | 斯人如彩虹 + + + + + + + + + + + +

T级职业等级标准1

1/3/2021 工作
能力范畴 能力描述 初级 中级 高级
一般外包开发公司 月薪8000左右 创业公司、一线互联网企业 月薪 20000 左右 一线互联网企业、BAT 月薪 30000 以上
T1 T2 T3 T4 T5 T6 T7 T8 T9
代码能力 创造高质量合规代码(具备低耦合,高扩展性,高性能,安全性等特征)及相关工具的能力。 掌握一门语言的常用特性,并能完成简单的功能开发。 熟练使用一门语言的常用特性,可以独立完成小型项目的编码任务。 熟练使用简单的设计模式,并且能够进行完整的单元测试,可参与大型项目的代码编写。 熟练使用简单的设计模式,并且能够进行完整的单元测试,可参与大型项目的代码编写。 具备复杂问题的分析与代码调试能力,写出安全合规的代码。 熟练使用常见的设计模式,输出高质量的代码,并且有基本的性能考量。 熟练使用高级的设计模式,并且能够使用相关工具对模块进行性能测试和分析,优化服务的性能瓶颈。 精通一门语言的使用,能进行模块化代码设计和编码,并且能够写出高性能的代码。 精通设计模式及OOP原则,输出逻辑耦合低,可维护性强,可扩展性高的代码。
运营能力 灵活应用运营数据,大数据分析等手段, 从成本,质量,效率等维度剖析系统运营状况,优化服务,达成用户体验好,运营效率高,资源合理使用等目标的能力。 熟悉操作系统的常用命令,能完成服务的搭建,并具备日志分析和常规问题的解决能力。 掌握批处理脚本的编写,自动化的完成服务的搭建,并能使用常用的系统工具定位复杂问题。 熟练使用监控、告警等基础设施,基于相关运营工具及运营系统处理线上问题。 熟练使用监控、告警等基础设施,基于相关运营工具及运营系统处理线上问题。 熟练使用监控、告警等基础设施,基于相关运营工具及运营系统处理线上问题。 熟练使用监控、告警等基础设施,基于相关运营工具及运营系统处理线上问题。 熟练使用监控、告警等基础设施,基于相关运营工具及运营系统处理线上问题。 能总结共性的运营问题,开发诊断和处理的工具,提升团队研发效能。 能从资源视角,对服务运营的部署架构,模块性能进行分析,构建容量模型,优化资源使用效率。
安全能力 掌握系统设计与实现过程中的安全漏洞风险,提升系统的可用性和安全性,保障业务和数据不受侵害。 不要求 不要求 了解导致后台系统被入侵的安全漏洞,在日常开发中理解并按规范避免这些漏洞。 了解导致后台系统被入侵的安全漏洞,在日常开发中理解并按规范避免这些漏洞。 了解导致后台系统被入侵的安全漏洞,在日常开发中理解并按规范避免这些漏洞。 了解导致后台系统被入侵的安全漏洞,在日常开发中理解并按规范避免这些漏洞。 了解导致后台系统被入侵的安全漏洞,在日常开发中理解并按规范避免这些漏洞。 了解导致后台系统被入侵的安全漏洞,在日常开发中理解并按规范避免这些漏洞。 熟悉相关的安全技术,深入理解各种常见安全漏洞的原理,并在系统设计与实现中合理应用。
架构能力 灵活应用底层基础设施,设计和构建高质量分布式服务(具备高可用,伸缩能力强,数据可靠性和安全性高,运营可控性强等特征)的能力。 不要求 不要求 不要求 不要求 了解主流的分布式架构,能参与到分布式服务的协同开发。 了解云上常见的基础服务和组件,并且在项目中应用。 可以应用主流的分布式架构,主导设计和开发无状态简单分布式服务。 熟悉主流的分布式架构,主导设计和开发复杂的分布式服务。 熟练从容量和容错等维度剖析系统架构,发现并优化系统在可伸缩,高可用等方面存在的问题和风险。
工程素养 把握工程项目中的主要矛盾,核心挑战和关键技术难点,组织和协调资源,达成目标的能力。 不要求 不要求 不要求 不要求 不要求 不要求 不要求 不要求 能承担项目owner的角色,协助项目经理和leader进行项目管理,关注工程项目中的主要矛盾、核心挑战和关键技术难点,帮助团队达成目标。
+ + + diff --git a/blogs/work/resume.html b/blogs/work/resume.html new file mode 100644 index 0000000..dac96f3 --- /dev/null +++ b/blogs/work/resume.html @@ -0,0 +1,115 @@ + + + + + + 我的简历 | 斯人如彩虹 + + + + + + + + + + + +

我的简历

1/3/2021 工作

# 罗子文

男 | 25 岁 (1997/10/10) | 现居住武汉 |两年 linux c开发经验 +手机:188 2734 1204 邮箱:191658428@qq.com

学校:	湖北理工学院	学历/学位:	本科
+

专业: 网络工程 职能/职位:  软件工程师  c/c++开发工程师

# 工作及教育经历

2016/9-2020/7 湖北理工学院  +本科 | 网络工程 +专业描述: 主要课程:C/C++程序设计,数据结构,计算机网络,操作系统原理,计算机组成原理, linux服务器搭建。

2019/12-至今 武汉天融信创新科技有限公司  +网络准入控制产品部 | linux c开发工程师 +详细描述: 参与网络准入控制系统开发与维护。

# 项目经验

2019/12-至今 网络准入系统 Linux + Windows + C +Python + freeradius +Nginx + redis + dpdk +项目描述: 一款用于局域网内控制终端接入的系统,在交换机上配置策略,由服务端认证,认证主要模式分为ip层和mac层两种准入,基于freeradius的802.1X认证和基于dpdk的端口镜像模式。802.1X模式由freeradius做认证交换机端口授权,端口镜像基于dpdk做流量控制,后端架构由基于ZeroMQ实现进程间通信消息服务、onlineserver用户上下线服务、agserver用户保活认证等,另外通过webserver实现对用户和策略的管理。

使用技术: Nginx:反向代理将相应的请求转发到对应端口;freeradius:802.1X认证;sqlite:维护用户资产指纹信息;redis:作为缓存在线信息等,加快sqlite读写能力;keepalived:高可用性双机热备;ZeroMQ:进程间通信消息队列中间件;libevent网络库;线程池;reactor反应堆;openssl开源加密库;json格式传输数据;syslog日志系统;Makefile;libconfig配置文件读取等。 +项目负责: 1.将原有代码迁移并使用Makefile对项目进行一键编译生成ramdisk。 +2.实现平台适应自旋锁,CAS等; +3.使用fortify代码审计工具,对项目中危险函数,内存泄露,缓冲区溢出等问题进行修改; +4.编写启动脚本按模块加载程序; +5.添加基于freeradius的802.1x认证功能模块,在交换机eap协议基础上设计新的协议对用户数据封装,实现对于终端所在交换机acl、vlan切换和对于终端的健康检查,设备外联监控等策略下发。 +6.对共用认证逻辑包括密码解码,ldap认证,终端资产校验进行封装,独立出认证库 +7.实现基于dpdk的端口镜像模式,使用dpdk rtc多进程结构根据cpu个数对网卡RSS初始化,实现主从进程间的协调工作,对关键数据包引流,对dns请求进行欺骗,对httpget请求重定向,其他tcp包阻断等。 +8.实现redis连接池设计封装reids命令,实现数据持久化。 +9.实现消息分发服务msgserver使用ZeroMQ消息队列中push/pull,pub/sub模式和多消息段协调各服务间的数据通信,增加各进程间吞吐量。

# 专业能力

1 .熟悉C/C++ 能熟练使用面向对象方式编程,熟悉常用设计模式。 +2.熟悉linux/unix环境编程,操作系统,进程间通信,多线程编程,对内存/进程管理有一定了解。 +3.熟悉linux/unix环境常用操作命令与shell脚本,熟悉gcc编译、makefile、gdb。 +4.熟悉dpdk api,能熟练的使用dpdk对协议栈修改,对tcp/ip协议栈有一定了解。 +5.熟悉socket网络编程,熟悉 TCP/IP协议,熟悉select/epoll等多路复用模型。 +6.熟悉redis数据结构,mysql表操作命令,能在项目中熟练使用。 +7.熟悉常用数据结构,链表、栈、队列,二叉树、红黑树,与常用查找和排序算法。 +8.熟悉wireshark,tcpdump抓包工具,能对常见网络故障进行分析。 +9.熟悉svn、git代码管理工具,fortify代码审计工具使用。 +10.对python,lua,golang有了解和使用。

# 自我评价:

逻辑思维能力强,动手能力和执行力较高,有良好的编程习惯; +善于在工作中发现问题、分析问题、解决问题,并作出总结,做事积极性高; +喜欢阅读,apue、unp、linux高性能服务器等书; +喜欢技术,阅读源码redis、freeradius, 协程等源码;

+ + + diff --git a/categories/index.html b/categories/index.html new file mode 100644 index 0000000..731bfc2 --- /dev/null +++ b/categories/index.html @@ -0,0 +1,87 @@ + + + + + + Categories | 斯人如彩虹 + + + + + + + + + + + + + + + diff --git a/categories/redis/index.html b/categories/redis/index.html new file mode 100644 index 0000000..d879599 --- /dev/null +++ b/categories/redis/index.html @@ -0,0 +1,87 @@ + + + + + + redis Categories | 斯人如彩虹 + + + + + + + + + + + + + + + diff --git a/categories/zmq/index.html b/categories/zmq/index.html new file mode 100644 index 0000000..b4f0d66 --- /dev/null +++ b/categories/zmq/index.html @@ -0,0 +1,87 @@ + + + + + + zmq Categories | 斯人如彩虹 + + + + + + + + + + + + + + + diff --git "a/categories/\345\267\245\344\275\234/index.html" "b/categories/\345\267\245\344\275\234/index.html" new file mode 100644 index 0000000..2ad1719 --- /dev/null +++ "b/categories/\345\267\245\344\275\234/index.html" @@ -0,0 +1,87 @@ + + + + + + 工作 Categories | 斯人如彩虹 + + + + + + + + + + + + + + + diff --git "a/categories/\347\237\245\350\257\206/index.html" "b/categories/\347\237\245\350\257\206/index.html" new file mode 100644 index 0000000..4f4d3d7 --- /dev/null +++ "b/categories/\347\237\245\350\257\206/index.html" @@ -0,0 +1,87 @@ + + + + + + 知识 Categories | 斯人如彩虹 + + + + + + + + + + + + + + + diff --git "a/categories/\350\201\212\345\244\251/index.html" "b/categories/\350\201\212\345\244\251/index.html" new file mode 100644 index 0000000..ea278c8 --- /dev/null +++ "b/categories/\350\201\212\345\244\251/index.html" @@ -0,0 +1,87 @@ + + + + + + 聊天 Categories | 斯人如彩虹 + + + + + + + + + + + + + + + diff --git "a/categories/\351\235\242\347\273\217/index.html" "b/categories/\351\235\242\347\273\217/index.html" new file mode 100644 index 0000000..33d0d28 --- /dev/null +++ "b/categories/\351\235\242\347\273\217/index.html" @@ -0,0 +1,87 @@ + + + + + + 面经 Categories | 斯人如彩虹 + + + + + + + + + + + + + + + diff --git a/docs/theme-reco/index.html b/docs/theme-reco/index.html new file mode 100644 index 0000000..24991c3 --- /dev/null +++ b/docs/theme-reco/index.html @@ -0,0 +1,87 @@ + + + + + + 可以打开文章最下面留下评论哦 | 斯人如彩虹 + + + + + + + + + + + +

可以打开文章最下面留下评论哦

11/12/2200

下面可以留下昵称、邮箱和评论哦

快留下你的意见或者建议,偷偷加QQ:191658428也行哦

Last Updated: 11/12/2023, 5:00:07 PM
+ + + diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 0000000..fe46dfe Binary files /dev/null and b/favicon.ico differ diff --git a/favicon1.ico b/favicon1.ico new file mode 100644 index 0000000..77e5c32 Binary files /dev/null and b/favicon1.ico differ diff --git a/hero.png b/hero.png new file mode 100644 index 0000000..458c223 Binary files /dev/null and b/hero.png differ diff --git a/index.html b/index.html new file mode 100644 index 0000000..ef2b079 --- /dev/null +++ b/index.html @@ -0,0 +1,103 @@ + + + + + + 斯人如彩虹 + + + + + + + + + + + +

斯人如彩虹

+ 斯人如彩虹 遇上方知有 +

+ But every once in a while you find someone who's iridescent, and when you do, nothing will ever compare. +

6/12/2024 知识
7/24/2022 知识
6/19/2022 知识
6/4/2022 知识
5/27/2022
123 Next Jump To Go
author-avatar

+ lzwtty +

23

Articles

6

Tags

Categories


Tags

All知识聊天面经rediszmq工作

Friend Links

+ + + diff --git a/js/MouseClickEffect.js b/js/MouseClickEffect.js new file mode 100644 index 0000000..788fe46 --- /dev/null +++ b/js/MouseClickEffect.js @@ -0,0 +1,34 @@ +var a_idx = 0; + +function getRandom(max, min) { + return Math.floor(Math.random() * (max - min + 1) + min); +} +jQuery(document).ready(function ($) { + $("body").click(function (e) { + // var a = new Array("富强", "民主", "文明", "和谐", "自由", "平等", "公正", "法治", "爱国", "敬业", "诚信", "友善"); + var a = new Array("我", "喜", "欢", "婷", "宝", "婷", "宝", "最", "好", "了"); + var $i = $("").text(a[a_idx]); + a_idx = (a_idx + 1) % a.length; + var x = e.pageX, + y = e.pageY; + $i.css({ + "z-index": 999999999999999999999999999999999999999999999999999999999999999999999, + "top": y - 20, + "left": x, + "position": "absolute", + "font-weight": "bold", + "color": `rgb(${getRandom(255,0)},${getRandom(255,0)},${getRandom(255,0)})`, + "user-select": 'none', + "cursor": 'default' + }); + $("body").append($i); + $i.animate({ + "top": y - 180, + "opacity": 0 + }, + 1500, + function () { + $i.remove(); + }); + }); +}); \ No newline at end of file diff --git a/logo.png b/logo.png new file mode 100644 index 0000000..9dd377f Binary files /dev/null and b/logo.png differ diff --git a/logo1.png b/logo1.png new file mode 100644 index 0000000..ac01252 Binary files /dev/null and b/logo1.png differ diff --git a/tag/index.html b/tag/index.html new file mode 100644 index 0000000..cfdef2e --- /dev/null +++ b/tag/index.html @@ -0,0 +1,87 @@ + + + + + + Tags | 斯人如彩虹 + + + + + + + + + + + + + + + diff --git a/tag/redis/index.html b/tag/redis/index.html new file mode 100644 index 0000000..afcfe9f --- /dev/null +++ b/tag/redis/index.html @@ -0,0 +1,87 @@ + + + + + + redis Tags | 斯人如彩虹 + + + + + + + + + + + + + + + diff --git a/tag/zmq/index.html b/tag/zmq/index.html new file mode 100644 index 0000000..1791e30 --- /dev/null +++ b/tag/zmq/index.html @@ -0,0 +1,87 @@ + + + + + + zmq Tags | 斯人如彩虹 + + + + + + + + + + + + + + + diff --git "a/tag/\345\267\245\344\275\234/index.html" "b/tag/\345\267\245\344\275\234/index.html" new file mode 100644 index 0000000..2482201 --- /dev/null +++ "b/tag/\345\267\245\344\275\234/index.html" @@ -0,0 +1,87 @@ + + + + + + 工作 Tags | 斯人如彩虹 + + + + + + + + + + + + + + + diff --git "a/tag/\347\237\245\350\257\206/index.html" "b/tag/\347\237\245\350\257\206/index.html" new file mode 100644 index 0000000..ff54963 --- /dev/null +++ "b/tag/\347\237\245\350\257\206/index.html" @@ -0,0 +1,87 @@ + + + + + + 知识 Tags | 斯人如彩虹 + + + + + + + + + + + + + + + diff --git "a/tag/\350\201\212\345\244\251/index.html" "b/tag/\350\201\212\345\244\251/index.html" new file mode 100644 index 0000000..9de6be4 --- /dev/null +++ "b/tag/\350\201\212\345\244\251/index.html" @@ -0,0 +1,87 @@ + + + + + + 聊天 Tags | 斯人如彩虹 + + + + + + + + + + + + + + + diff --git "a/tag/\351\235\242\347\273\217/index.html" "b/tag/\351\235\242\347\273\217/index.html" new file mode 100644 index 0000000..c9c3684 --- /dev/null +++ "b/tag/\351\235\242\347\273\217/index.html" @@ -0,0 +1,87 @@ + + + + + + 面经 Tags | 斯人如彩虹 + + + + + + + + + + + + + + + diff --git a/timeline/index.html b/timeline/index.html new file mode 100644 index 0000000..168fc7b --- /dev/null +++ b/timeline/index.html @@ -0,0 +1,87 @@ + + + + + + Timeline | 斯人如彩虹 + + + + + + + + + + + +
  • 2200

    • 11-12 可以打开文章最下面留下评论哦
  • 2024

    • 6-12 有用的知识网站
  • 2022

    • 7-24 perf工具和火焰图简介
    • 7-11 C/C++/MySQL/Redis/操作系统/八股文/Leetcode
    • 6-26 gdb查看堆内存以及内存泄漏的一种定位方法
    • 6-19 c1000k,单机百万并发测试
    • 6-12 mutex、读写锁、自旋锁、信号量以及RCU的性能测试
    • 6-4 GDB调试手册
    • 6-4 相处阶段-亚瑟·阿伦三十六问
    • 5-27 markdown语法
    • 5-22 相处阶段-熟悉 (二)
    • 5-22 相处阶段-吸引 (三)
    • 5-22 相处阶段-认识 (一)
    • 5-22 相处阶段-约会
  • 2021

    • 1-3 T级职业等级标准
    • 1-3 T级职业等级标准1
    • 1-3 我的简历
  • 2020

    • 12-15 多益网络面经
    • 12-15 深信服面经
  • 2019

    • 9-21 second page in category1
    • 4-9 vuepress-theme-reco
  • 2018

    • 12-15 first page in redis
  • 2016

    • 12-15 first page in zmq
+ + +