Files
visual_debugger/cpp/main.cpp
mynameisdeleted a8d105005e feat(debug): add GDB-based debug visualizer for linked lists
Replace the custom toDebugGraph() method that generated JSON directly in C++ with a generic GDB Python script (debug_graph.py). The script traverses pointers and structures to build a graph representation for the VS Code Debug Visualizer, enabling external pointer display and more extensible visualization.

Update launch configurations to load the script and to disable array/string truncation (needed for the visualizer JSON). Add a debugAdapterConfigurations entry in settings.json to use the expression template $debug_graph(${expr}) for the cppdbg adapter.
2026-07-09 12:14:27 -04:00

76 lines
1.8 KiB
C++

#include <iostream>
#include <optional>
// A single node containing data and a raw pointer to the next node
template <typename T>
struct Node {
T data;
Node<T>* next;
};
// The main wrapper for the linked list tracking the head node
template <typename T>
class LinkedList {
public:
LinkedList() : head_(nullptr) {}
~LinkedList() {
Node<T>* current = head_;
while (current) {
Node<T>* next = current->next;
delete current;
current = next;
}
}
// Raw-pointer ownership can't be safely duplicated by a shallow copy
LinkedList(const LinkedList&) = delete;
LinkedList& operator=(const LinkedList&) = delete;
// Add a new element to the front of the list
void push_front(T data) {
head_ = new Node<T>{std::move(data), head_};
}
// Remove and return the front element of the list
std::optional<T> pop_front() {
if (!head_) {
return std::nullopt;
}
Node<T>* old_head = head_;
T data = std::move(old_head->data);
head_ = old_head->next;
delete old_head;
return data;
}
// Read the front element without removing it
const T* peek_front() const {
return head_ ? &head_->data : nullptr;
}
private:
Node<T>* head_;
};
int main() {
LinkedList<int> list;
// Demonstrate pushing items
list.push_front(10);
list.push_front(20);
list.push_front(30);
// Demonstrate peeking at the top item
if (const int* top = list.peek_front()) {
std::cout << "Top element: " << *top << "\n"; // Output: 30
}
// Demonstrate popping items
while (auto value = list.pop_front()) {
std::cout << "Popped: " << *value << "\n";
}
return 0;
}