Start here
การดีบัก
ตัวช่วยดีบักสำหรับเอาต์พุตแบบสตรีม โดยเฉพาะเมื่อผู้ให้บริการผสม reasoning เข้าไปในข้อความปกติ
การแทนที่ค่าดีบักขณะรันไทม์
ใช้ /debug ในแชตเพื่อตั้งค่าการแทนที่คอนฟิกแบบ เฉพาะรันไทม์ (อยู่ในหน่วยความจำ ไม่ใช่ดิสก์)
/debug ถูกปิดไว้โดยค่าเริ่มต้น; เปิดใช้ด้วย commands.debug: true
สิ่งนี้มีประโยชน์เมื่อคุณต้องสลับการตั้งค่าที่หาได้ยากโดยไม่ต้องแก้ไข openclaw.json
ตัวอย่าง:
/debug show
/debug set messages.responsePrefix="[openclaw]"
/debug unset messages.responsePrefix
/debug reset
/debug reset จะล้างการแทนที่ค่าทั้งหมดและกลับไปใช้คอนฟิกบนดิสก์
เอาต์พุต trace ของเซสชัน
ใช้ /trace เมื่อคุณต้องการดูบรรทัด trace/debug ที่ Plugin เป็นเจ้าของในเซสชันเดียว
โดยไม่ต้องเปิดโหมด verbose เต็มรูปแบบ
ตัวอย่าง:
/trace
/trace on
/trace off
ใช้ /trace สำหรับการวินิจฉัย Plugin เช่นสรุปดีบักของ Active Memory
ใช้ /verbose ต่อไปสำหรับเอาต์พุตสถานะ/tool แบบ verbose ตามปกติ และใช้
/debug ต่อไปสำหรับการแทนที่คอนฟิกแบบเฉพาะรันไทม์
trace วงจรชีวิต Plugin
ใช้ OPENCLAW_PLUGIN_LIFECYCLE_TRACE=1 เมื่อคำสั่งวงจรชีวิต Plugin รู้สึกช้า
และคุณต้องการการแยกเฟสในตัวสำหรับเมทาดาทา Plugin, การค้นพบ, registry,
runtime mirror, การกลายพันธุ์ของคอนฟิก และงานรีเฟรช trace นี้เป็นแบบ opt-in และเขียน
ไปยัง stderr ดังนั้นเอาต์พุตคำสั่ง JSON จึงยัง parse ได้
ตัวอย่าง:
OPENCLAW_PLUGIN_LIFECYCLE_TRACE=1 openclaw plugins install tokenjuice --force
เอาต์พุตตัวอย่าง:
[plugins:lifecycle] phase="config read" ms=6.83 status=ok command="install"
[plugins:lifecycle] phase="slot selection" ms=94.31 status=ok command="install" pluginId="tokenjuice"
[plugins:lifecycle] phase="registry refresh" ms=51.56 status=ok command="install" reason="source-changed"
ใช้สิ่งนี้สำหรับการตรวจสอบวงจรชีวิต Plugin ก่อนหันไปใช้ CPU profiler
หากคำสั่งกำลังรันจาก source checkout ให้เลือกวัดรันไทม์ที่ build แล้ว
ด้วย node dist/entry.js ... หลัง pnpm build; pnpm openclaw ...
จะวัดโอเวอร์เฮดของ source-runner ด้วย
การโปรไฟล์การเริ่มต้น CLI และคำสั่ง
ใช้ startup benchmark ที่เช็กอินไว้เมื่อคำสั่งรู้สึกช้า:
pnpm test:startup:bench:smoke
pnpm tsx scripts/bench-cli-startup.ts --preset real --case status --runs 3
pnpm tsx scripts/bench-cli-startup.ts --preset real --cpu-prof-dir .artifacts/cli-cpu
สำหรับการโปรไฟล์แบบครั้งเดียวผ่าน source runner ปกติ ให้ตั้งค่า
OPENCLAW_RUN_NODE_CPU_PROF_DIR:
OPENCLAW_RUN_NODE_CPU_PROF_DIR=.artifacts/cli-cpu pnpm openclaw status
source runner จะเพิ่มแฟล็ก Node CPU profile และเขียน .cpuprofile สำหรับ
คำสั่ง ใช้สิ่งนี้ก่อนเพิ่ม instrumentation ชั่วคราวในโค้ดคำสั่ง
สำหรับอาการค้างตอนเริ่มต้นที่ดูเหมือนงานระบบไฟล์แบบซิงโครนัสหรือ module-loader ให้เพิ่มแฟล็ก trace I/O แบบซิงค์ของ Node ผ่าน source runner:
OPENCLAW_TRACE_SYNC_IO=1 pnpm openclaw gateway --force
pnpm gateway:watch เปิดใช้แฟล็กนี้โดยค่าเริ่มต้นสำหรับ Gateway child ที่ถูก watch
ตั้งค่า OPENCLAW_TRACE_SYNC_IO=0 เพื่อระงับเอาต์พุต trace I/O แบบซิงค์ของ Node ในโหมด watch
โหมด watch ของ Gateway
เพื่อการวนแก้ไขที่รวดเร็ว ให้รัน gateway ใต้ file watcher:
pnpm gateway:watch
โดยค่าเริ่มต้น สิ่งนี้จะเริ่มหรือรีสตาร์ตเซสชัน tmux ชื่อ
openclaw-gateway-watch-main (หรือรูปแบบเฉพาะ profile/port เช่น
openclaw-gateway-watch-dev-19001) และ auto-attach จากเทอร์มินัลแบบโต้ตอบ
เชลล์ที่ไม่โต้ตอบ, CI และ agent exec calls จะคงสถานะ detached และพิมพ์คำแนะนำการ attach
แทน attach ด้วยตนเองเมื่อต้องการ:
tmux attach -t openclaw-gateway-watch-main
pane ของ tmux รัน watcher ดิบ:
node scripts/watch-node.mjs gateway --force
ใช้โหมด foreground เมื่อไม่ต้องการ tmux:
pnpm gateway:watch:raw
# or
OPENCLAW_GATEWAY_WATCH_TMUX=0 pnpm gateway:watch
ปิด auto-attach โดยยังคงการจัดการ tmux ไว้:
OPENCLAW_GATEWAY_WATCH_ATTACH=0 pnpm gateway:watch
โปรไฟล์เวลา CPU ของ Gateway ที่ถูก watch เมื่อตรวจแก้ hotspot ช่วงเริ่มต้น/รันไทม์:
pnpm gateway:watch --benchmark
watch wrapper จะใช้ --benchmark ก่อนเรียกใช้ Gateway และเขียน
V8 .cpuprofile หนึ่งไฟล์ต่อการออกของ Gateway child ใต้
.artifacts/gateway-watch-profiles/ หยุดหรือรีสตาร์ต gateway ที่ถูก watch เพื่อ
flush โปรไฟล์ปัจจุบัน จากนั้นเปิดด้วย Chrome DevTools หรือ Speedscope:
npx speedscope .artifacts/gateway-watch-profiles/*.cpuprofile
ใช้ --benchmark-dir <path> เมื่อคุณต้องการเก็บโปรไฟล์ไว้ที่อื่น
ใช้ --benchmark-no-force เมื่อคุณต้องการให้ child ที่ benchmark ข้ามการล้างพอร์ต
--force ตามค่าเริ่มต้น และล้มเหลวอย่างรวดเร็วหากพอร์ต Gateway ถูกใช้งานอยู่แล้ว
โหมด benchmark จะระงับสแปม trace sync-I/O โดยค่าเริ่มต้น ตั้งค่า
OPENCLAW_TRACE_SYNC_IO=1 พร้อม --benchmark เมื่อคุณต้องการทั้ง CPU
profiles และ stack traces ของ Node sync-I/O อย่างชัดเจน ในโหมด benchmark บล็อก trace เหล่านั้น
จะถูกเขียนไปยัง gateway-watch-output.log ใต้ไดเรกทอรี benchmark และ
ถูกกรองออกจาก pane ของเทอร์มินัล; log Gateway ปกติยังคงมองเห็นได้
tmux wrapper จะส่งตัวเลือก runtime ที่ไม่ใช่ความลับซึ่งใช้กันทั่วไป เช่น
OPENCLAW_PROFILE, OPENCLAW_CONFIG_PATH, OPENCLAW_STATE_DIR,
OPENCLAW_GATEWAY_PORT, และ OPENCLAW_SKIP_CHANNELS เข้าไปใน pane ใส่
credentials ของผู้ให้บริการไว้ใน profile/config ปกติของคุณ หรือใช้โหมด foreground ดิบ
สำหรับ secret ชั่วคราวแบบครั้งเดียว
หาก Gateway ที่ถูก watch ออกระหว่างการเริ่มต้น watcher จะรัน
openclaw doctor --fix --non-interactive หนึ่งครั้งและรีสตาร์ต Gateway child
ใช้ OPENCLAW_GATEWAY_WATCH_AUTO_DOCTOR=0 เมื่อคุณต้องการดูความล้มเหลวตอนเริ่มต้นเดิม
โดยไม่มีรอบซ่อมแซมเฉพาะ dev
pane ของ tmux ที่จัดการแล้วยังตั้งค่าเริ่มต้นเป็น log Gateway แบบมีสีเพื่อให้อ่านง่าย;
ตั้งค่า FORCE_COLOR=0 เมื่อเริ่ม pnpm gateway:watch เพื่อปิดเอาต์พุต ANSI
watcher จะรีสตาร์ตเมื่อไฟล์ที่เกี่ยวข้องกับการ build ใต้ src/, ไฟล์ซอร์สของ extension,
เมทาดาทา package.json และ openclaw.plugin.json ของ extension, tsconfig.json,
package.json, และ tsdown.config.ts เปลี่ยนแปลง การเปลี่ยนแปลงเมทาดาทา extension จะรีสตาร์ต
gateway โดยไม่บังคับให้ tsdown rebuild; การเปลี่ยนแปลงซอร์สและคอนฟิกยังคง
rebuild dist ก่อน
เพิ่มแฟล็ก CLI ของ gateway ใด ๆ หลัง gateway:watch แล้วแฟล็กเหล่านั้นจะถูกส่งผ่านใน
ทุกครั้งที่รีสตาร์ต การรันคำสั่ง watch เดิมซ้ำจะ respawn pane ของ tmux ที่มีชื่อไว้ และ
watcher ดิบยังคงใช้ล็อก single-watcher เพื่อให้ parent watcher ที่ซ้ำกัน
ถูกแทนที่แทนที่จะสะสมขึ้นเรื่อย ๆ
Dev profile + dev gateway (--dev)
ใช้ dev profile เพื่อแยก state และเปิดใช้งานชุดตั้งค่าที่ปลอดภัย ใช้แล้วทิ้งได้สำหรับ
การดีบัก มีแฟล็ก --dev สอง แบบ:
- Global
--dev(profile): แยก state ไว้ใต้~/.openclaw-devและ ตั้งค่าเริ่มต้นพอร์ต gateway เป็น19001(พอร์ตที่ derive จะเลื่อนตาม) gateway --dev: บอก Gateway ให้สร้างคอนฟิกเริ่มต้น + workspace โดยอัตโนมัติ เมื่อไม่มีอยู่ (และข้าม BOOTSTRAP.md)
โฟลว์ที่แนะนำ (dev profile + dev bootstrap):
pnpm gateway:dev
OPENCLAW_PROFILE=dev openclaw tui
หากคุณยังไม่ได้ติดตั้งแบบ global ให้รัน CLI ผ่าน pnpm openclaw ...
สิ่งที่ทำ:
-
การแยก Profile (global
--dev)OPENCLAW_PROFILE=devOPENCLAW_STATE_DIR=~/.openclaw-devOPENCLAW_CONFIG_PATH=~/.openclaw-dev/openclaw.jsonOPENCLAW_GATEWAY_PORT=19001(browser/canvas จะเลื่อนตาม)
-
Dev bootstrap (
gateway --dev)- เขียนคอนฟิกขั้นต่ำหากไม่มี (
gateway.mode=local, bind loopback) - ตั้งค่า
agent.workspaceเป็น dev workspace - ตั้งค่า
agent.skipBootstrap=true(ไม่มี BOOTSTRAP.md) - สร้างไฟล์ workspace เริ่มต้นหากไม่มี:
AGENTS.md,SOUL.md,TOOLS.md,IDENTITY.md,USER.md,HEARTBEAT.md - identity เริ่มต้น: C3-PO (protocol droid)
- ข้ามผู้ให้บริการ channel ในโหมด dev (
OPENCLAW_SKIP_CHANNELS=1)
- เขียนคอนฟิกขั้นต่ำหากไม่มี (
โฟลว์รีเซ็ต (เริ่มใหม่):
pnpm gateway:dev:reset
--reset จะล้างคอนฟิก, credentials, sessions และ dev workspace (โดยใช้
trash ไม่ใช่ rm) จากนั้นสร้างชุดตั้งค่า dev เริ่มต้นใหม่
การบันทึก raw stream (OpenClaw)
OpenClaw สามารถบันทึก raw assistant stream ก่อนการกรอง/จัดรูปแบบใด ๆ นี่เป็นวิธีที่ดีที่สุดในการดูว่า reasoning มาถึงเป็น plain text deltas (หรือเป็น thinking blocks แยกต่างหาก)
เปิดใช้ผ่าน CLI:
pnpm gateway:watch --raw-stream
การ override path แบบไม่บังคับ:
pnpm gateway:watch --raw-stream --raw-stream-path ~/.openclaw/logs/raw-stream.jsonl
env vars ที่เทียบเท่า:
OPENCLAW_RAW_STREAM=1
OPENCLAW_RAW_STREAM_PATH=~/.openclaw/logs/raw-stream.jsonl
ไฟล์เริ่มต้น:
~/.openclaw/logs/raw-stream.jsonl
การบันทึก raw chunk (pi-mono)
เพื่อจับ raw OpenAI-compat chunks ก่อนถูก parse เป็นบล็อก pi-mono มี logger แยกต่างหาก:
PI_RAW_STREAM=1
path แบบไม่บังคับ:
PI_RAW_STREAM_PATH=~/.pi-mono/logs/raw-openai-completions.jsonl
ไฟล์เริ่มต้น:
~/.pi-mono/logs/raw-openai-completions.jsonl
หมายเหตุ: สิ่งนี้ถูก emit เฉพาะโดยโปรเซสที่ใช้ผู้ให้บริการ
openai-completionsของ pi-mono เท่านั้น
หมายเหตุด้านความปลอดภัย
- raw stream logs อาจมี prompts เต็มรูปแบบ, เอาต์พุต tool และข้อมูลผู้ใช้
- เก็บ logs ไว้ในเครื่องและลบหลังดีบักเสร็จ
- หากคุณแชร์ logs ให้ล้าง secrets และ PII ก่อน
การดีบักใน VSCode
source maps จำเป็นต่อการเปิดใช้การดีบักใน IDE ที่อิง VSCode เพราะไฟล์ที่สร้างจำนวนมากจะลงท้ายด้วยชื่อแบบ hashed ซึ่งเป็นส่วนหนึ่งของกระบวนการ build คอนฟิก launch.json ที่รวมมาจะ target บริการ Gateway แต่สามารถปรับอย่างรวดเร็วเพื่อวัตถุประสงค์อื่นได้:
- Rebuild and Debug Gateway - ดีบักบริการ Gateway หลังสร้าง build ใหม่
- Debug Gateway - ดีบักบริการ Gateway ของ build ที่มีอยู่แล้ว
การตั้งค่า
คอนฟิก Rebuild and Debug Gateway เริ่มต้นมาพร้อมทุกอย่างที่ต้องใช้ โดยจะลบโฟลเดอร์ /dist โดยอัตโนมัติและ rebuild โปรเจกต์พร้อมเปิดใช้การดีบัก:
- เปิดแผง Run and Debug จาก Activity Bar หรือกด
Ctrl+Shift+D - ใน IDE ตรวจสอบให้แน่ใจว่าเลือก Rebuild and Debug Gateway ในดรอปดาวน์คอนฟิก จากนั้นกดปุ่ม Start Debugging
อีกทางเลือกหนึ่ง - หากคุณต้องการจัดการกระบวนการ build และ debug ด้วยตนเอง:
- เปิดเทอร์มินัลและเปิดใช้ source maps:
- Linux/macOS:
export OUTPUT_SOURCE_MAPS=1 - Windows (PowerShell):
$env:OUTPUT_SOURCE_MAPS="1" - Windows (CMD):
set OUTPUT_SOURCE_MAPS=1
- Linux/macOS:
- ในเทอร์มินัลเดียวกัน ให้ rebuild โปรเจกต์:
pnpm clean:dist && pnpm build - ใน IDE เลือกตัวเลือก Debug Gateway ในดรอปดาวน์คอนฟิก Run and Debug จากนั้นกดปุ่ม Start Debugging
ตอนนี้คุณสามารถตั้ง breakpoints ในไฟล์ซอร์ส TypeScript ของคุณ (ไดเรกทอรี src/) และ debugger จะ map breakpoints ไปยัง JavaScript ที่ compile แล้วได้อย่างถูกต้องผ่าน source maps คุณจะสามารถตรวจสอบตัวแปร, step through code และตรวจสอบ call stacks ได้ตามที่คาดไว้
หมายเหตุ
- หากใช้ตัวเลือก "Rebuild and Debug Gateway" - ทุกครั้งที่เปิด debugger ระบบจะลบโฟลเดอร์
/distทั้งหมดและรันpnpm buildเต็มรูปแบบโดยเปิดใช้ source maps ก่อนเริ่ม Gateway - หากใช้ตัวเลือก "Debug Gateway" - debug sessions สามารถเริ่มและหยุดได้ตลอดเวลาโดยไม่กระทบโฟลเดอร์
/distแต่คุณต้องใช้โปรเซสเทอร์มินัลแยกต่างหากเพื่อทั้งเปิดใช้การดีบักและจัดการรอบการ build - แก้ไขการตั้งค่า
launch.jsonสำหรับargsเพื่อดีบักส่วนอื่นของโปรเจกต์ - หากคุณต้องใช้ OpenClaw CLI ที่ build แล้วสำหรับงานอื่น (เช่น
dashboard --no-openหาก debug session ของคุณสร้าง auth token ใหม่) คุณสามารถเรียกใช้ในเทอร์มินัลอื่นเป็นnode ./openclaw.mjsหรือสร้าง shell alias เช่นalias openclaw-build="node $(pwd)/openclaw.mjs"