विषय पर बढ़ें

अंतिम अद्यतन:2026-10-12

Bazel और LLDB संयुक्त डिबगिंग

आज डिबगिंग करते समय पाया कि bazel से compile की गई फ़ाइलें mac पर डिबग नहीं हो रही थीं—— सामने तो बस असेंबली कोड था।

* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
    frame #0: 0x0000000100000fd0 hello_world`main
hello_world`main:
->  0x100000fd0 <+0>: pushq  %rbp
    0x100000fd1 <+1>: movq   %rsp, %rbp
    0x100000fd4 <+4>: subq   $0x60, %rsp
    0x100000fd8 <+8>: movl   $0x0, -0x4(%rbp)
(lldb) quit

इसे कैसे हल करें?

डिफ़ॉल्ट standalone है, जिसे disable करना है; यहाँ local अपनाते हैं, जिसका मतलब है कि आउटपुट डिफ़ॉल्ट standalone रणनीति के बजाय अपनी dependencies के साथ लिंक होगा।

build --spawn_strategy=local

इससे कोड दिखने लगता है।

* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
    frame #0: 0x0000000100000fdf hello_world`main at hello_world.cc:14:21
   11  
   12   int main() {
   13     // Create a thread pool
-> 14     auto threadPool = GetCpuThreadPool();
   15     if (!threadPool) {

सिद्धांत की व्याख्या

ऐसा क्यों होता है? Bazel की डिफ़ॉल्ट standalone spawn रणनीति compile क्रियाओं को sandbox में चलाती है; macOS पर sandbox का implementation (sandbox-exec) debug info के पथ और dSYM जनन को बिगाड़ देता है, जिससे binary की symbol table अधूरी रह जाती है—— LLDB आपको केवल असेंबली दिखा सकता है।

इस पर स्विच करें:

build --spawn_strategy=local

इसका मतलब है कि compile क्रियाएँ सीधे स्थानीय मशीन पर चलती हैं, sandbox में नहीं; symbol information पूरी तरह सुरक्षित रहती है और breakpoints सही स्रोत-पंक्तियों पर आ जाते हैं। सलाह है कि इसे प्रोजेक्ट की .bazelrc में सीधे लिख दें, एक बार में हमेशा के लिए:

build --spawn_strategy=local
build --compilation_mode=dbg   # 调试构建记得带 -c dbg

(1) डिबगिंग के समय bazel build -c dbg //... या bazel run -c dbg इस्तेमाल करें ताकि -O0 -g ज़रूर लगे;

(2) Linux पर डिफ़ॉल्ट sandbox आम तौर पर debug symbols को प्रभावित नहीं करता; यह समस्या मुख्य रूप से macOS पर आती है;

(3) अगर फिर भी सोर्स कोड न दिखे तो dSYM जाँचें: dsymutil ./hello_world && lldb ./hello_world।

इस तरह Bazel + LLDB खुशी-खुशी साथ काम करते हैं। कोई और गड्ढा मिला हो तो कमेंट में जोड़ने का स्वागत है~

संबंधित विषय

टिप्पणियाँ