अंतिम अद्यतन:2026-10-12
C++ STL Debug मोड¶
समस्या¶
Project चरण के schema में fields बदल गए, fields एक vector node है, जिसका हर member std::shared_ptr<arrow::Field> है, बदलाव से पहले और बाद के vector pointers की तुलना करने पर पाया कि _M_impl के _M_start की position बदल गई है, इसलिए gdb watch से इस बदलाव को देखना है कि कहाँ इसे बदला गया।
Vector का structure¶
vector का code:
https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/bits/stl_vector.h
typedef typename __gnu_cxx::__alloc_traits<_Tp_alloc_type>::pointer
pointer;
struct _Vector_impl_data
{
pointer _M_start;
pointer _M_finish;
pointer _M_end_of_storage;
}
कुछ ज़रूरी जानकारी जानना आवश्यक है:
_M_startऔर_M_finishआदि pointer types हैं- pointer type एक raw pointer type है
यह जानकारी मिलने के बाद, हम watch से बहुत आसानी से देख सकते हैं कि इस _M_start में क्या बदलाव हुआ, ध्यान दें: इस pointer _M_start में बदलाव हुआ है, न कि इसके value में।
Watch¶
सबसे पहले इसका address print करें:
(gdb) p &((arrow::Schema::Impl *)this->output_schema_->impl_)->fields_._M_impl._M_start
$10 = (std::_Vector_base<std::shared_ptr<arrow::Field>, std::allocator<std::shared_ptr<arrow::Field> > >::pointer *) 0xb11dd0
हमें pointer* का address मिल गया, फिर इसे watch करें।
(gdb) watch *((std::_Vector_base<std::shared_ptr<arrow::Field>, std::allocator<std::shared_ptr<arrow::Field> > >::pointer *) 0xb11dd0)
Hardware watchpoint 2: *((std::_Vector_base<std::shared_ptr<arrow::Field>, std::allocator<std::shared_ptr<arrow::Field> > >::pointer *) 0xb11dd0)
इसके बाद हम continue करते हैं, और बदलाव का point मिल जाता है:
(gdb) c
Continuing.
Thread 1 "postgres" hit Hardware watchpoint 2: *((std::_Vector_base<std::shared_ptr<arrow::Field>, std::allocator<std::shared_ptr<arrow::Field> > >::pointer *) 0xb11dd0)
Old value = (std::_Vector_base<std::shared_ptr<arrow::Field>, std::allocator<std::shared_ptr<arrow::Field> > >::pointer) 0x979470
New value = (std::_Vector_base<std::shared_ptr<arrow::Field>, std::allocator<std::shared_ptr<arrow::Field> > >::pointer) 0x9fe1e0
VecSeqNext (node=0x9fdc40) at src/backend/vecexecutor/nodeSeqscan.c:210
210 if (table_scan_getnextslot(scandesc, direction, slot))
(gdb) bt
#0 VecSeqNext (node=0x9fdc40) at src/backend/vecexecutor/nodeSeqscan.c:210
#1 0x00007f45994e5c70 in ExecVecScanFetchInternal
(node=0x9fdc40, accessMtd=0x7f45994e6335 <VecSeqNext>, recheckMtd=0x7f45994e6430 <VecSeqRecheck>) at src/backend/vecexecutor/execScan.c:146
#2 0x00007f45994e58da in ExecVecScanFetch (node=0x9fdc40, accessMtd=0x7f45994e6335 <VecSeqNext>, recheckMtd=0x7f45994e6430 <VecSeqRecheck>)
at src/backend/vecexecutor/execScan.c:40
#3 0x00007f45994e5d0b in ExecVecScan
(node=0x9fdc40, vestate=0x9fdd48, accessMtd=0x7f45994e6335 <VecSeqNext>, recheckMtd=0x7f45994e6430 <VecSeqRecheck>)
at src/backend/vecexecutor/execScan.c:200
#4 0x00007f45994e6487 in ExecVecSeqScan (pstate=0x9fdc40) at src/backend/vecexecutor/nodeSeqscan.c:246
#5 0x00007f45994c40ce in VecExecProcNodeGPDB (node=0x9fdc40) at src/backend/hook/executor.c:102
#6 0x00007f45994c41c2 in VecExecProcNodeFirst (node=0x9fdc40) at src/backend/hook/executor.c:153
#7 0x00007f45994dc610 in ExecProcNode (node=0x9fdc40) at /home/gpadmin/install/cbdb/include/postgresql/server/executor/executor.h:281
#8 0x00007f45994e2065 in get_current_next_batch (node=0x9fdc40) at src/backend/vecexecutor/execMain.c:1851
#9 0x00007f4599375c76 in get_arrow_record_batch(GetNextCallback, void*) (fn=0x7f45994e204d <get_current_next_batch>, arg=0x9fdc40)
at c_glib/arrow-glib/reader.cpp:216
संबंधित विषय¶
- Bazel से C++ प्रोजेक्ट बिल्ड करना | C++那些事
- Bazel और LLDB संयुक्त डिबगिंग | C++那些事
- CMake की शुरुआत और व्यवहार | C++那些事
- Conan C++ पैकेज मैनेजर की शुरुआत | C++那些事
- C++ Insights कंपाइल-टाइम अवलोकन | C++那些事
- C++ Jupyter Notebook इंटरैक्शन | C++那些事
- C++ string को int में बदलना | C++那些事
- C++ dbg-macro डीबगिंग मैक्रो | C++那些事
- GCC कंपाइलेशन विकल्पों की विस्तृत जानकारी | C++那些事
- GDB से C++ प्रोग्राम डीबग करना | C++那些事