{"id":7580,"date":"2026-08-02T01:52:43","date_gmt":"2026-08-01T17:52:43","guid":{"rendered":"https:\/\/i007.cc\/wordpress\/?p=7580"},"modified":"2026-08-02T01:52:55","modified_gmt":"2026-08-01T17:52:55","slug":"7580","status":"publish","type":"post","link":"https:\/\/i007.cc\/wordpress\/archives\/7580","title":{"rendered":"Linux \u7a0b\u5e8f\u8c03\u8bd5\u6700\u4f73\u5b9e\u8df5"},"content":{"rendered":"<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">GDB \u547d\u4ee4\u884c\u786e\u5b9e\u53cd\u4eba\u7c7b\uff0c\u4f46\u5b83\u662f\u57fa\u7840\u3002\u73b0\u4ee3\u5f00\u53d1\u8005\u90fd\u5728\u7528\u66f4\u597d\u7684\u5de5\u5177\u5c42\u53e0\u5728 GDB \u4e4b\u4e0a\u3002<\/p>\n<hr class=\"border-border-200 border-t-0.5 my-3 mx-1.5\" \/>\n<h3 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\" dir=\"ltr\">\u4e00\u3001\u5148\u89e3\u51b3 GDB \u96be\u7528\u7684\u95ee\u9898<\/h3>\n<h4 class=\"text-text-100 mt-2 -mb-1 text-base font-bold\" dir=\"ltr\">TUI \u6a21\u5f0f \u2014\u2014 GDB \u81ea\u5e26\u7684\u56fe\u5f62\u5316<\/h4>\n<div class=\"relative group\/copy bg-bg-000\/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100\" tabindex=\"0\" role=\"group\" aria-label=\"bash code\">\n<div class=\"sticky opacity-0 group-hover\/copy:opacity-100 group-focus-within\/copy:opacity-100 top-2 py-2 h-12 w-0 float-right\">\n<div class=\"absolute right-0 h-8 px-2 items-center inline-flex z-10\"><\/div>\n<\/div>\n<div class=\"text-text-500 font-small p-3.5 pb-0\">bash<\/div>\n<div class=\"overflow-x-auto\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">gdb -tui .\/game_server\r\n\r\n# \u6216\u8fdb\u5165 GDB \u540e\r\n(gdb) tui enable\r\n(gdb) layout src      # \u4e0a\u65b9\u663e\u793a\u6e90\u7801\uff0c\u4e0b\u65b9\u547d\u4ee4\u884c\r\n(gdb) layout asm      # \u663e\u793a\u6c47\u7f16\r\n(gdb) layout split    # \u6e90\u7801 + \u6c47\u7f16\u5e76\u6392\r\n(gdb) layout regs     # \u663e\u793a\u5bc4\u5b58\u5668<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\u4f46 TUI \u8fd8\u662f\u5f88\u4e11\uff0c\u771f\u6b63\u597d\u7528\u7684\u662f\u4e0b\u9762\u8fd9\u4e9b\u3002<\/p>\n<h4 class=\"text-text-100 mt-2 -mb-1 text-base font-bold\" dir=\"ltr\">GDB Dashboard \u2014\u2014 \u514d\u8d39\uff0c\u6548\u679c\u63a5\u8fd1 IDE<\/h4>\n<div class=\"relative group\/copy bg-bg-000\/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100\" tabindex=\"0\" role=\"group\" aria-label=\"bash code\">\n<div class=\"sticky opacity-0 group-hover\/copy:opacity-100 group-focus-within\/copy:opacity-100 top-2 py-2 h-12 w-0 float-right\">\n<div class=\"absolute right-0 h-8 px-2 items-center inline-flex z-10\"><\/div>\n<\/div>\n<div class=\"text-text-500 font-small p-3.5 pb-0\">bash<\/div>\n<div class=\"overflow-x-auto\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\"># \u5b89\u88c5\uff08\u4e00\u884c\u547d\u4ee4\uff09\r\nwget -P ~ https:\/\/git.io\/.gdbinit\r\n\r\n# \u4e4b\u540e gdb \u81ea\u52a8\u52a0\u8f7d\uff0c\u663e\u793a\uff1a\r\n# \u2500\u2500\u2500 Source \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n# \u5f53\u524d\u6267\u884c\u4f4d\u7f6e\u9ad8\u4eae\r\n# \u2500\u2500\u2500 Variables \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n# \u5c40\u90e8\u53d8\u91cf\u5b9e\u65f6\u663e\u793a\r\n# \u2500\u2500\u2500 Stack \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n# \u8c03\u7528\u6808\r\n# \u2500\u2500\u2500 Threads \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n# \u6240\u6709\u7ebf\u7a0b\u72b6\u6001<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<h4 class=\"text-text-100 mt-2 -mb-1 text-base font-bold\" dir=\"ltr\">pwndbg \/ peda \u2014\u2014 \u529f\u80fd\u66f4\u5f3a\u7684 GDB \u589e\u5f3a<\/h4>\n<div class=\"relative group\/copy bg-bg-000\/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100\" tabindex=\"0\" role=\"group\" aria-label=\"bash code\">\n<div class=\"sticky opacity-0 group-hover\/copy:opacity-100 group-focus-within\/copy:opacity-100 top-2 py-2 h-12 w-0 float-right\">\n<div class=\"absolute right-0 h-8 px-2 items-center inline-flex z-10\"><\/div>\n<\/div>\n<div class=\"text-text-500 font-small p-3.5 pb-0\">bash<\/div>\n<div class=\"overflow-x-auto\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">pip install pwndbg\r\n# \u6216\r\ngit clone https:\/\/github.com\/pwndbg\/pwndbg &amp;&amp; cd pwndbg &amp;&amp; .\/setup.sh<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<hr class=\"border-border-200 border-t-0.5 my-3 mx-1.5\" \/>\n<h3 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\" dir=\"ltr\">\u4e8c\u3001\u771f\u6b63\u597d\u7528\u7684\u65b9\u6848\uff1aIDE \u96c6\u6210\u8c03\u8bd5<\/h3>\n<h4 class=\"text-text-100 mt-2 -mb-1 text-base font-bold\" dir=\"ltr\">VS Code + GDB\uff08\u6700\u63a8\u8350\uff09<\/h4>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\u5b89\u88c5 <strong>C\/C++ Extension<\/strong>\uff0c\u7136\u540e\u914d\u7f6e <code class=\"bg-text-200\/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">.vscode\/launch.json<\/code>\uff1a<\/p>\n<div class=\"relative group\/copy bg-bg-000\/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100\" tabindex=\"0\" role=\"group\" aria-label=\"json code\">\n<div class=\"sticky opacity-0 group-hover\/copy:opacity-100 group-focus-within\/copy:opacity-100 top-2 py-2 h-12 w-0 float-right\">\n<div class=\"absolute right-0 h-8 px-2 items-center inline-flex z-10\"><\/div>\n<\/div>\n<div class=\"text-text-500 font-small p-3.5 pb-0\">json<\/div>\n<div class=\"overflow-x-auto\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">{\r\n    \"version\": \"0.2.0\",\r\n    \"configurations\": [\r\n        {\r\n            \"name\": \"Debug Game Server\",\r\n            \"type\": \"cppdbg\",\r\n            \"request\": \"launch\",\r\n            \"program\": \"${workspaceFolder}\/build\/game_server\",\r\n            \"args\": [\"--config\", \"dev.json\"],\r\n            \"stopAtEntry\": false,\r\n            \"cwd\": \"${workspaceFolder}\",\r\n            \"environment\": [\r\n                {\"name\": \"LOG_LEVEL\", \"value\": \"DEBUG\"}\r\n            ],\r\n            \"MIMode\": \"gdb\",\r\n            \"setupCommands\": [\r\n                {\r\n                    \"description\": \"Enable pretty-printing\",\r\n                    \"text\": \"-enable-pretty-printing\"\r\n                }\r\n            ]\r\n        },\r\n        {\r\n            \"name\": \"Attach to Process\",     \/\/ \u9644\u52a0\u5230\u6b63\u5728\u8fd0\u884c\u7684\u8fdb\u7a0b\r\n            \"type\": \"cppdbg\",\r\n            \"request\": \"attach\",\r\n            \"program\": \"${workspaceFolder}\/build\/game_server\",\r\n            \"processId\": \"${command:pickProcess}\",\r\n            \"MIMode\": \"gdb\"\r\n        },\r\n        {\r\n            \"name\": \"Debug Core Dump\",       \/\/ \u5206\u6790 coredump\r\n            \"type\": \"cppdbg\",\r\n            \"request\": \"launch\",\r\n            \"program\": \"${workspaceFolder}\/build\/game_server\",\r\n            \"coreDumpPath\": \"\/tmp\/core.12345\",\r\n            \"MIMode\": \"gdb\"\r\n        }\r\n    ]\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\u4e4b\u540e\u5c31\u662f\u6b63\u5e38 IDE \u4f53\u9a8c\uff1a\u70b9\u51fb\u884c\u53f7\u8bbe\u65ad\u70b9\u3001Watch \u7a97\u53e3\u770b\u53d8\u91cf\u3001Call Stack \u9762\u677f\u770b\u8c03\u7528\u6808\uff0cF5\/F10\/F11 \u6b65\u8fdb\u3002<\/p>\n<h4 class=\"text-text-100 mt-2 -mb-1 text-base font-bold\" dir=\"ltr\">CLion\uff08\u4ed8\u8d39\uff0c\u6700\u5b8c\u6574\uff09<\/h4>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">JetBrains \u51fa\u54c1\uff0cCMake \u9879\u76ee\u76f4\u63a5\u6253\u5f00\u5c31\u80fd\u8c03\u8bd5\uff0c\u667a\u80fd\u611f\u77e5 + \u8c03\u8bd5\u4f53\u9a8c\u6700\u63a5\u8fd1 Visual Studio\u3002EA \u8fd9\u79cd\u5927\u5382\u5185\u90e8\u5f88\u591a\u4eba\u7528 CLion\u3002<\/p>\n<hr class=\"border-border-200 border-t-0.5 my-3 mx-1.5\" \/>\n<h3 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\" dir=\"ltr\">\u4e09\u3001\u4e0d\u540c\u573a\u666f\u7684\u8c03\u8bd5\u7b56\u7565<\/h3>\n<h4 class=\"text-text-100 mt-2 -mb-1 text-base font-bold\" dir=\"ltr\">\u573a\u666f1\uff1a\u672c\u5730\u5f00\u53d1\u8c03\u8bd5<\/h4>\n<div class=\"relative group\/copy bg-bg-000\/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100\" tabindex=\"0\" role=\"group\" aria-label=\"bash code\">\n<div class=\"sticky opacity-0 group-hover\/copy:opacity-100 group-focus-within\/copy:opacity-100 top-2 py-2 h-12 w-0 float-right\">\n<div class=\"absolute right-0 h-8 px-2 items-center inline-flex z-10\"><\/div>\n<\/div>\n<div class=\"text-text-500 font-small p-3.5 pb-0\">bash<\/div>\n<div class=\"overflow-x-auto\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\"># \u7f16\u8bd1\u65f6\u5fc5\u987b\u52a0\u8c03\u8bd5\u4fe1\u606f\uff0c\u5173\u95ed\u4f18\u5316\r\ncmake -DCMAKE_BUILD_TYPE=Debug ..\r\n# \u7b49\u4ef7\u4e8e\uff1ag++ -g -O0 -DDEBUG\r\n\r\n# -g3 \u5305\u542b\u5b8f\u5b9a\u4e49\u4fe1\u606f\uff08\u8c03\u8bd5\u5b8f\u65f6\u6709\u7528\uff09\r\ng++ -g3 -O0 game_server.cpp -o game_server<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\"><strong>\u5173\u952e<\/strong>\uff1a<code class=\"bg-text-200\/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">-O2<\/code> \u4f18\u5316\u540e\u53d8\u91cf\u53ef\u80fd\u88ab\u4f18\u5316\u6389\u3001\u5faa\u73af\u88ab\u5c55\u5f00\u3001\u51fd\u6570\u88ab\u5185\u8054\uff0cGDB \u770b\u5230\u7684\u4ee3\u7801\u884c\u987a\u5e8f\u4f1a\u4e71\u6389\uff0c\u8c03\u8bd5\u4f53\u9a8c\u6781\u5dee\u3002\u5f00\u53d1\u9636\u6bb5\u4e00\u5b9a\u7528 <code class=\"bg-text-200\/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">-O0<\/code>\u3002<\/p>\n<h4 class=\"text-text-100 mt-2 -mb-1 text-base font-bold\" dir=\"ltr\">\u573a\u666f2\uff1a\u751f\u4ea7\u73af\u5883 Crash \u5206\u6790\uff08coredump\uff09<\/h4>\n<div class=\"relative group\/copy bg-bg-000\/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100\" tabindex=\"0\" role=\"group\" aria-label=\"bash code\">\n<div class=\"sticky opacity-0 group-hover\/copy:opacity-100 group-focus-within\/copy:opacity-100 top-2 py-2 h-12 w-0 float-right\">\n<div class=\"absolute right-0 h-8 px-2 items-center inline-flex z-10\"><\/div>\n<\/div>\n<div class=\"text-text-500 font-small p-3.5 pb-0\">bash<\/div>\n<div class=\"overflow-x-auto\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\"># 1. \u751f\u4ea7\u73af\u5883\u5f00\u542f coredump\uff08\u52a0\u5230\u542f\u52a8\u811a\u672c\uff09\r\nulimit -c unlimited\r\necho \"\/var\/cores\/core.%e.%p.%t\" &gt; \/proc\/sys\/kernel\/core_pattern\r\n\r\n# 2. \u5173\u952e\uff1a\u751f\u4ea7\u7f16\u8bd1\u7528 -O2 \u4f46\u4fdd\u7559\u7b26\u53f7\r\ng++ -O2 -g game_server.cpp -o game_server\r\n# \u6216\u8005\u5206\u79bb\u7b26\u53f7\u6587\u4ef6\uff08\u4e0d\u628a\u8c03\u8bd5\u4fe1\u606f\u653e\u8fdb\u4e8c\u8fdb\u5236\uff09\r\ng++ -O2 game_server.cpp -o game_server\r\nobjcopy --only-keep-debug game_server game_server.debug\r\nstrip game_server  # \u751f\u4ea7\u4e8c\u8fdb\u5236\u4e0d\u5e26\u8c03\u8bd5\u4fe1\u606f\uff0c\u4f53\u79ef\u5c0f\r\n# \u5d29\u6e83\u540e\u52a0\u8f7d\u7b26\u53f7\uff1a\r\ngdb game_server -s game_server.debug -c core.12345\r\n\r\n# 3. \u7528 VS Code \u6253\u5f00 coredump \u5206\u6790\r\n# launch.json \u91cc\u914d\u7f6e coreDumpPath \u5373\u53ef<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<h4 class=\"text-text-100 mt-2 -mb-1 text-base font-bold\" dir=\"ltr\">\u573a\u666f3\uff1a\u5185\u5b58\u95ee\u9898\uff08\u6700\u5934\u75bc\uff09<\/h4>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\"><strong>AddressSanitizer \u2014\u2014 \u9996\u9009\uff0c\u5f00\u53d1\u671f\u5fc5\u7528<\/strong><\/p>\n<div class=\"relative group\/copy bg-bg-000\/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100\" tabindex=\"0\" role=\"group\" aria-label=\"bash code\">\n<div class=\"sticky opacity-0 group-hover\/copy:opacity-100 group-focus-within\/copy:opacity-100 top-2 py-2 h-12 w-0 float-right\">\n<div class=\"absolute right-0 h-8 px-2 items-center inline-flex z-10\"><\/div>\n<\/div>\n<div class=\"text-text-500 font-small p-3.5 pb-0\">bash<\/div>\n<div class=\"overflow-x-auto\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\"># \u7f16\u8bd1\u65f6\u5f00\u542f\uff0c\u65e0\u9700\u6539\u4ee3\u7801\r\ng++ -fsanitize=address,undefined -fno-omit-frame-pointer -g -O1 \\\r\n    game_server.cpp -o game_server_asan\r\n\r\n# \u8fd0\u884c\u65f6\u81ea\u52a8\u68c0\u6d4b\uff1a\r\n# - \u5806\u8d8a\u754c\uff08heap buffer overflow\uff09\r\n# - \u6808\u8d8a\u754c\uff08stack buffer overflow\uff09  \r\n# - use-after-free\r\n# - double-free\r\n# - \u5185\u5b58\u6cc4\u6f0f\uff08\u8fdb\u7a0b\u9000\u51fa\u65f6\u62a5\u544a\uff09\r\n\r\n# \u8f93\u51fa\u793a\u4f8b\uff1a\r\n# ERROR: AddressSanitizer: heap-use-after-free on address 0x...\r\n# READ of size 4 at 0x... thread T0\r\n#     #0 0x... in PlayerManager::update() player.cpp:42\r\n#     #1 0x... in GameLoop::tick() gameloop.cpp:87<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\"><strong>ThreadSanitizer \u2014\u2014 \u68c0\u6d4b\u6570\u636e\u7ade\u4e89<\/strong><\/p>\n<div class=\"relative group\/copy bg-bg-000\/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100\" tabindex=\"0\" role=\"group\" aria-label=\"bash code\">\n<div class=\"sticky opacity-0 group-hover\/copy:opacity-100 group-focus-within\/copy:opacity-100 top-2 py-2 h-12 w-0 float-right\">\n<div class=\"absolute right-0 h-8 px-2 items-center inline-flex z-10\"><\/div>\n<\/div>\n<div class=\"text-text-500 font-small p-3.5 pb-0\">bash<\/div>\n<div class=\"overflow-x-auto\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">g++ -fsanitize=thread -g -O1 game_server.cpp -o game_server_tsan\r\n# \u8fd0\u884c\u65f6\u62a5\u544a\uff1a\r\n# WARNING: ThreadSanitizer: data race\r\n#   Write of size 8 at 0x... by thread T2:\r\n#   Previous read of size 8 at 0x... by thread T1:<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\"><strong>Valgrind \u2014\u2014 \u66f4\u5168\u9762\u4f46\u5f88\u6162<\/strong><\/p>\n<div class=\"relative group\/copy bg-bg-000\/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100\" tabindex=\"0\" role=\"group\" aria-label=\"bash code\">\n<div class=\"sticky opacity-0 group-hover\/copy:opacity-100 group-focus-within\/copy:opacity-100 top-2 py-2 h-12 w-0 float-right\">\n<div class=\"absolute right-0 h-8 px-2 items-center inline-flex z-10\"><\/div>\n<\/div>\n<div class=\"text-text-500 font-small p-3.5 pb-0\">bash<\/div>\n<div class=\"overflow-x-auto\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\"># \u68c0\u6d4b\u5185\u5b58\u6cc4\u6f0f\uff08\u7a0b\u5e8f\u8dd1\u6162 10-50 \u500d\uff0c\u9002\u5408\u529f\u80fd\u6d4b\u8bd5\u9636\u6bb5\uff09\r\nvalgrind --leak-check=full \\\r\n         --show-leak-kinds=all \\\r\n         --track-origins=yes \\\r\n         --log-file=valgrind.log \\\r\n         .\/game_server\r\n\r\n# \u8f93\u51fa\uff1a\r\n# LEAK SUMMARY:\r\n#   definitely lost: 1,024 bytes in 3 blocks  \u2190 \u771f\u6b63\u7684\u6cc4\u6f0f\r\n#   indirectly lost: 2,048 bytes in 8 blocks\r\n#   possibly lost: 512 bytes in 1 blocks<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<h4 class=\"text-text-100 mt-2 -mb-1 text-base font-bold\" dir=\"ltr\">\u573a\u666f4\uff1a\u6027\u80fd\u95ee\u9898<\/h4>\n<div class=\"relative group\/copy bg-bg-000\/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100\" tabindex=\"0\" role=\"group\" aria-label=\"bash code\">\n<div class=\"sticky opacity-0 group-hover\/copy:opacity-100 group-focus-within\/copy:opacity-100 top-2 py-2 h-12 w-0 float-right\">\n<div class=\"absolute right-0 h-8 px-2 items-center inline-flex z-10\"><\/div>\n<\/div>\n<div class=\"text-text-500 font-small p-3.5 pb-0\">bash<\/div>\n<div class=\"overflow-x-auto\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\"># perf + \u706b\u7130\u56fe \u2014\u2014 \u5b9a\u4f4d CPU \u70ed\u70b9\r\nperf record -F 99 -g -p $(pgrep game_server) -- sleep 30\r\nperf script | \\\r\n    stackcollapse-perf.pl | \\\r\n    flamegraph.pl &gt; \/tmp\/flame.svg\r\n\r\n# \u5728\u6d4f\u89c8\u5668\u6253\u5f00 flame.svg\uff0c\u6a2a\u8f74=\u5360\u7528\u6bd4\u4f8b\uff0c\u7eb5\u8f74=\u8c03\u7528\u6df1\u5ea6\r\n# \u5bbd\u7684\u5757 = \u70ed\u70b9\u51fd\u6570\uff0c\u76f4\u63a5\u9501\u5b9a\u4f18\u5316\u76ee\u6807<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<hr class=\"border-border-200 border-t-0.5 my-3 mx-1.5\" \/>\n<h3 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\" dir=\"ltr\">\u56db\u3001\u65e5\u5fd7\u8c03\u8bd5 \u2014\u2014 \u5f88\u591a\u65f6\u5019\u6bd4\u65ad\u70b9\u8c03\u8bd5\u66f4\u5b9e\u7528<\/h3>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\u751f\u4ea7\u73af\u5883\u4e0d\u80fd\u63a5 GDB\uff0c\u7ed3\u6784\u5316\u65e5\u5fd7\u662f\u4e3b\u529b\u3002<\/p>\n<h4 class=\"text-text-100 mt-2 -mb-1 text-base font-bold\" dir=\"ltr\">spdlog\uff08C++ \u6e38\u620f\u540e\u7aef\u9996\u9009\u65e5\u5fd7\u5e93\uff09<\/h4>\n<div class=\"relative group\/copy bg-bg-000\/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100\" tabindex=\"0\" role=\"group\" aria-label=\"cpp code\">\n<div class=\"sticky opacity-0 group-hover\/copy:opacity-100 group-focus-within\/copy:opacity-100 top-2 py-2 h-12 w-0 float-right\">\n<div class=\"absolute right-0 h-8 px-2 items-center inline-flex z-10\"><\/div>\n<\/div>\n<div class=\"text-text-500 font-small p-3.5 pb-0\">cpp<\/div>\n<div class=\"overflow-x-auto\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">#include &lt;spdlog\/spdlog.h&gt;\r\n#include &lt;spdlog\/sinks\/rotating_file_sink.h&gt;\r\n\r\n\/\/ \u521d\u59cb\u5316\uff1a\u6309\u5927\u5c0f\u6eda\u52a8\u7684\u65e5\u5fd7\u6587\u4ef6\r\nauto logger = spdlog::rotating_logger_mt(\r\n    \"game\", \"logs\/game.log\", \r\n    100 * 1024 * 1024,  \/\/ 100MB per file\r\n    5                    \/\/ \u4fdd\u75595\u4e2a\u6587\u4ef6\r\n);\r\nlogger-&gt;set_level(spdlog::level::debug);\r\nlogger-&gt;set_pattern(\"[%Y-%m-%d %H:%M:%S.%e] [%l] [tid:%t] %v\");\r\n\r\n\/\/ \u4f7f\u7528\r\nspdlog::info(\"Player {} joined match {}\", player_id, match_id);\r\nspdlog::warn(\"Match queue timeout, elapsed={}ms\", elapsed);\r\nspdlog::error(\"DB connection failed: {}\", e.what());\r\n\r\n\/\/ \u5173\u952e\uff1a\u5f02\u6b65\u65e5\u5fd7\uff0c\u4e0d\u963b\u585e\u6e38\u620f\u7ebf\u7a0b\r\nspdlog::init_thread_pool(8192, 1);  \/\/ \u961f\u52178192\u6761\uff0c1\u4e2a\u540e\u53f0\u5199\u5165\u7ebf\u7a0b\r\nauto async_logger = spdlog::basic_logger_async_mt(...);<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<h4 class=\"text-text-100 mt-2 -mb-1 text-base font-bold\" dir=\"ltr\">\u6761\u4ef6\u7f16\u8bd1\u8c03\u8bd5\u8f93\u51fa<\/h4>\n<div class=\"relative group\/copy bg-bg-000\/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100\" tabindex=\"0\" role=\"group\" aria-label=\"cpp code\">\n<div class=\"sticky opacity-0 group-hover\/copy:opacity-100 group-focus-within\/copy:opacity-100 top-2 py-2 h-12 w-0 float-right\">\n<div class=\"absolute right-0 h-8 px-2 items-center inline-flex z-10\"><\/div>\n<\/div>\n<div class=\"text-text-500 font-small p-3.5 pb-0\">cpp<\/div>\n<div class=\"overflow-x-auto\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">\/\/ \u5f00\u53d1\u671f\u8be6\u7ec6\u65e5\u5fd7\uff0c\u751f\u4ea7\u671f\u96f6\u5f00\u9500\r\n#ifdef DEBUG\r\n    #define DBG_LOG(fmt, ...) \\\r\n        spdlog::debug(\"[{}:{}] \" fmt, __FILE__, __LINE__, ##__VA_ARGS__)\r\n#else\r\n    #define DBG_LOG(fmt, ...) do {} while(0)  \/\/ \u5b8c\u5168\u6d88\u9664\uff0c\u96f6\u5f00\u9500\r\n#endif\r\n\r\n\/\/ \u5e26\u4e0a\u4e0b\u6587\u7684\u65ad\u8a00\r\n#define GAME_ASSERT(cond, msg) \\\r\n    do { \\\r\n        if (!(cond)) { \\\r\n            spdlog::critical(\"ASSERT FAILED: {} at {}:{}\", \\\r\n                             msg, __FILE__, __LINE__); \\\r\n            spdlog::dump_backtrace(); \\\r\n            std::abort(); \\\r\n        } \\\r\n    } while(0)<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<hr class=\"border-border-200 border-t-0.5 my-3 mx-1.5\" \/>\n<h3 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\" dir=\"ltr\">\u4e94\u3001\u5b9e\u7528 GDB \u547d\u4ee4\u901f\u67e5\uff08\u5fc5\u987b\u8bb0\u7684\u90a3\u4e9b\uff09<\/h3>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\u771f\u6b63\u9700\u8981\u4e0a GDB \u65f6\uff0c\u5c31\u8fd9\u51e0\u6761\u6700\u5e38\u7528\uff1a<\/p>\n<div class=\"relative group\/copy bg-bg-000\/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100\" tabindex=\"0\" role=\"group\" aria-label=\"bash code\">\n<div class=\"sticky opacity-0 group-hover\/copy:opacity-100 group-focus-within\/copy:opacity-100 top-2 py-2 h-12 w-0 float-right\">\n<div class=\"absolute right-0 h-8 px-2 items-center inline-flex z-10\"><\/div>\n<\/div>\n<div class=\"text-text-500 font-small p-3.5 pb-0\">bash<\/div>\n<div class=\"overflow-x-auto\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\"># \u542f\u52a8\r\ngdb .\/game_server\r\ngdb -p 12345              # \u9644\u52a0\u5230\u8fdb\u7a0b\r\n\r\n# \u65ad\u70b9\r\nb player.cpp:42           # \u6587\u4ef6\u884c\u53f7\r\nb PlayerManager::update   # \u51fd\u6570\u540d\r\nb player.cpp:42 if id==5  # \u6761\u4ef6\u65ad\u70b9\uff08\u53ea\u5728 id==5 \u65f6\u505c\uff09\r\nwatch g_player_count      # \u53d8\u91cf\u53d8\u5316\u65f6\u505c\r\n\r\n# \u6267\u884c\u63a7\u5236\r\nr                         # run \u542f\u52a8\r\nc                         # continue \u7ee7\u7eed\r\nn                         # next \u4e0b\u4e00\u884c\uff08\u4e0d\u8fdb\u51fd\u6570\uff09\r\ns                         # step \u8fdb\u5165\u51fd\u6570\r\nfin                       # finish \u6267\u884c\u5b8c\u5f53\u524d\u51fd\u6570\r\nuntil 50                  # \u8fd0\u884c\u5230\u7b2c50\u884c\r\n\r\n# \u67e5\u770b\u72b6\u6001\r\nbt                        # backtrace \u8c03\u7528\u6808\r\nbt full                   # \u5e26\u5c40\u90e8\u53d8\u91cf\u7684\u5b8c\u6574\u8c03\u7528\u6808\r\nframe 3                   # \u5207\u6362\u5230\u7b2c3\u5e27\r\ninfo locals               # \u5f53\u524d\u5e27\u6240\u6709\u5c40\u90e8\u53d8\u91cf\r\np player-&gt;health          # print \u6253\u5370\u53d8\u91cf\r\np\/x addr                  # \u5341\u516d\u8fdb\u5236\u6253\u5370\r\nx\/10xw 0x7fff...          # \u67e5\u770b\u5185\u5b58\uff0810\u4e2aword\uff0c\u5341\u516d\u8fdb\u5236\uff09\r\n\r\n# \u591a\u7ebf\u7a0b\r\ninfo threads              # \u5217\u51fa\u6240\u6709\u7ebf\u7a0b\r\nthread 3                  # \u5207\u6362\u5230\u7ebf\u7a0b3\r\nthread apply all bt       # \u6240\u6709\u7ebf\u7a0b\u6253\u5370\u8c03\u7528\u6808\uff08\u6b7b\u9501\u5206\u6790\u5fc5\u7528\uff09<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\"><strong>\u6b7b\u9501\u5206\u6790\u7684\u56fa\u5b9a\u52a8\u4f5c<\/strong>\uff1a<\/p>\n<div class=\"relative group\/copy bg-bg-000\/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100\" tabindex=\"0\" role=\"group\" aria-label=\"bash code\">\n<div class=\"sticky opacity-0 group-hover\/copy:opacity-100 group-focus-within\/copy:opacity-100 top-2 py-2 h-12 w-0 float-right\">\n<div class=\"absolute right-0 h-8 px-2 items-center inline-flex z-10\"><\/div>\n<\/div>\n<div class=\"text-text-500 font-small p-3.5 pb-0\">bash<\/div>\n<div class=\"overflow-x-auto\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">gdb -p &lt;pid&gt;\r\n(gdb) thread apply all bt  # \u770b\u6240\u6709\u7ebf\u7a0b\u5361\u5728\u54ea\u91cc\r\n# \u901a\u5e38\u4f1a\u770b\u5230\u591a\u4e2a\u7ebf\u7a0b\u4e92\u76f8\u7b49 futex<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<hr class=\"border-border-200 border-t-0.5 my-3 mx-1.5\" \/>\n<h3 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\" dir=\"ltr\">\u516d\u3001\u63a8\u8350\u5de5\u5177\u7ec4\u5408<\/h3>\n<div class=\"relative group\/copy bg-bg-000\/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100\" tabindex=\"0\" role=\"group\" aria-label=\"Code\">\n<div class=\"sticky opacity-0 group-hover\/copy:opacity-100 group-focus-within\/copy:opacity-100 top-2 py-2 h-12 w-0 float-right\">\n<div class=\"absolute right-0 h-8 px-2 items-center inline-flex z-10\"><\/div>\n<\/div>\n<div class=\"overflow-x-auto\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">\u65e5\u5e38\u5f00\u53d1\uff1aVS Code + CMake(Debug) + ASan\r\n         F5 \u542f\u52a8 \u2192 \u70b9\u51fb\u65ad\u70b9 \u2192 Watch \u7a97\u53e3\r\n\r\n\u5185\u5b58\u95ee\u9898\uff1aASan\uff08\u9996\u9009\uff09\u2192 Valgrind\uff08\u515c\u5e95\uff09\r\n\r\n\u591a\u7ebf\u7a0bBug\uff1aTSan\uff08\u6570\u636e\u7ade\u4e89\uff09 + \u65e5\u5fd7\u65f6\u5e8f\u5206\u6790\r\n\r\n\u751f\u4ea7Crash\uff1acoredump + VS Code\/GDB \u79bb\u7ebf\u5206\u6790\r\n           + \u7ed3\u6784\u5316\u65e5\u5fd7\u56de\u6eaf\u73b0\u573a\r\n\r\n\u6027\u80fd\u74f6\u9888\uff1aperf \u706b\u7130\u56fe \u2192 \u5b9a\u4f4d\u70ed\u70b9 \u2192 \u9488\u5bf9\u6027\u4f18\u5316<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\u6838\u5fc3\u539f\u5219\uff1a<strong>\u8ba9\u5de5\u5177\u5e2e\u4f60\u627e\u95ee\u9898\uff0c\u800c\u4e0d\u662f\u9760\u76ef\u4ee3\u7801\u731c<\/strong>\u3002ASan \u80fd\u76f4\u63a5\u544a\u8bc9\u4f60 use-after-free \u5728\u7b2c\u51e0\u884c\uff0cTSan \u80fd\u544a\u8bc9\u4f60\u54ea\u4e24\u4e2a\u7ebf\u7a0b\u5728\u7ade\u4e89\u54ea\u4e2a\u53d8\u91cf\uff0c\u82b1\u65f6\u95f4\u914d\u597d\u5de5\u5177\u94fe\u6bd4\u53cd\u590d\u52a0 <code class=\"bg-text-200\/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">printf<\/code> \u8c03\u8bd5\u9ad8\u6548\u5341\u500d\u3002<\/p>\n<hr class=\"border-border-200 border-t-0.5 my-3 mx-1.5\" \/>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\u6709\u7279\u5b9a\u8c03\u8bd5\u573a\u666f\u60f3\u6df1\u5165\u7684\u8bdd\u53ef\u4ee5\u7ee7\u7eed\uff0c\u6bd4\u5982\u591a\u7ebf\u7a0b\u6b7b\u9501\u5b9a\u4f4d\u3001\u5185\u5b58\u6cc4\u6f0f\u6392\u67e5\u6d41\u7a0b\uff0c\u6216\u8005\u76f4\u63a5\u8f6c\u5230\u4e0b\u4e00\u4e2a EA \u9762\u8bd5\u9898\uff1f<\/p>\n","protected":false},"excerpt":{"rendered":"<p>GDB \u547d\u4ee4\u884c\u786e\u5b9e\u53cd\u4eba\u7c7b\uff0c\u4f46\u5b83\u662f\u57fa\u7840\u3002\u73b0<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"colormag_page_container_layout":"default_layout","colormag_page_sidebar_layout":"default_layout","footnotes":""},"categories":[24],"tags":[],"class_list":["post-7580","post","type-post","status-publish","format-standard","hentry","category-value_docs"],"_links":{"self":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts\/7580","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/comments?post=7580"}],"version-history":[{"count":0,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts\/7580\/revisions"}],"wp:attachment":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/media?parent=7580"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/categories?post=7580"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/tags?post=7580"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}