DEV Community

Cover image for 🦸 Supercharge your debugging skills with the console.trace
Ravin Rau
Ravin Rau

Posted on

🦸 Supercharge your debugging skills with the console.trace

Summary

🔍 What's your debugging superpower? Mine was discovering console.trace() - it turned hours of debugging into minutes by revealing the exact execution path in my code. Share your game-changing debugging tool that transformed your development workflow in the comment section below!

Skip the intro to go into the gist of the content

Introduction

When I first started coding, I relied heavily on console.log to debug and understand how my code was working. I think many of us have been there—sprinkling console.log statements everywhere to track down a pesky bug. But as our applications grow and we collaborate with larger teams, this approach can quickly become chaotic.

I remember one particular bug that had me stumped. It was related to a service I knew well, so I confidently took on the task. After two hours of diving into multiple files and littering my code with console.log statements, I was still no closer to finding the root cause. Frustrated, I reached out to a senior developer for help. That's when I was introduced to the magic of console.trace.

For the first time, I could see the stack trace of function calls, giving me a clear view of the execution flow. It was like having a map instead of wandering in the dark, guessing where to place my console.log statements.

Share your personal experience in the comment section below on which debugging tools help you to debug issues faster.

Debugging is a crucial part of software development, and JavaScript offers several tools to make this process easier. Two of the most common are console.log and console.trace. Let's dive into how these tools can be used effectively, using a simple bookstore application as an example.

BookStore Architecture
If you want to play around with the services with the console.log and console.trace, visit my github repo link here.


What is console.log?

consolelog

console.log is a method used to print messages to the console. It's often used to display variable values, track the flow of execution, or simply output information for the developer.

When to use it : Use console.log when you need to output simple messages or variable values. It's great for quick checks and confirming that certain parts of your code are executing as expected.


What is console.trace?

consoletrace

console.trace is a more advanced debugging tool that not only logs a message but also provides a stack trace. This stack trace shows the sequence of function calls that led to the point where console.trace was called, which can be invaluable for understanding the flow of execution and identifying where things might be going wrong.

When to use it: Use console.tracewhen you need more context about the execution flow. It's particularly useful for complex applications where understanding the call stack can help diagnose issues.


Scenario: 🦹 Debugging a Mysterious Order Total Calculation

Let's say we are getting a customer complaints that order totals are incorrect. Here's how we can demonstrate the power of console.trace() vs console.log():

  1. First, let's modify the OrderService.js to include both debugging approaches:
class OrderService {
    calculateTotal(items) {
        console.log('Calculating total for items:', items);  // Traditional approach

        const total = items.reduce((total, item) => {
            const book = this.bookService.getBook(item.bookId);
            console.trace('Book price calculation');  // Using console.trace
            return total + (book.price * item.quantity);
        }, 0);

        return total;
    }
}
Enter fullscreen mode Exit fullscreen mode

When you run this with an order that has incorrect totals, here's what you'll see:

With console.log():

Calculating total for items: [
  { bookId: 'book1', quantity: 2 },
  { bookId: 'book2', quantity: 1 }
]
Enter fullscreen mode Exit fullscreen mode

With console.trace():

Trace: Book price calculation
    at OrderService.calculateTotal (src/services/OrderService.js:40)
    at OrderService.createOrder (src/services/OrderService.js:27)
    at Object.<anonymous> (src/index.js:27)
Enter fullscreen mode Exit fullscreen mode

The console.trace() output immediately shows us the entire call stack, revealing that:

  1. The calculation starts in index.js
  2. Goes through createOrder
  3. Then hits calculateTotal

This becomes particularly valuable when you have multiple services calling each other. For example, if we look at the order creation flow in:

    createOrder(userId, items) {
        // console.trace('Creating order');  // Using console.trace

        const user = this.userService.getUser(userId);
        if (!user) {
            throw new Error('User not found');
        }

        // Verify all books are available
        for (const item of items) {
            if (!this.bookService.checkBookAvailability(item.bookId, item.quantity)) {
                throw new Error(`Book ${item.bookId} not available in requested quantity`);
            }
        }

        const order = {
            orderId: Math.random().toString(36).substr(2, 9),
            user: user,
            items: items,
            total: this.calculateTotal(items),
            status: 'pending'
        };

        // Process billing
        this.billingService.processBilling(order);

        return order;
    }
Enter fullscreen mode Exit fullscreen mode

If we add console.trace() in the processBilling method, we can see the complete chain of service calls:

// In BillingService.js
processBilling(order) {
    console.trace('Processing billing');
    return this.createInvoice(order);
}
Enter fullscreen mode Exit fullscreen mode

This would output:

Trace: Processing billing
    at BillingService.processBilling (src/services/BillingService.js:3)
    at OrderService.createOrder (src/services/OrderService.js:32)
    at Object.<anonymous> (src/index.js:27)
Enter fullscreen mode Exit fullscreen mode

This trace immediately shows us:

  • Which file initiated the billing process
  • The exact sequence of method calls
  • The specific line numbers where each call occurred

This is particularly useful when debugging issues in a complex system where multiple services interact, like in this bookstore application

When everything is connected

Without console.trace(), you might need multiple console.log() statements across different files to understand the execution flow. With console.trace(), you get the complete picture in one go.


✨ Best Practice Tip

Add console.trace() at critical points where services interact with each other, especially in methods that:

  1. Handle financial calculations
  2. Process user transactions
  3. Interact with multiple services
  4. Have complex conditional logic

This way, when issues arise, we can quickly understand the exact path our code took to reach that point.


Conclusion

Both console.log and console.trace are powerful tools for debugging, each serving different purposes. By using them appropriately, you can gain better insights into your application's behavior and more effectively identify and fix issues. Share your game-changing debugging tool that transformed your development workflow in the comment below!

Top comments (19)

Collapse
 
rohitkhokhar profile image
Rohit Khokhar

I'm a big fan of articles about console.trace()—thanks for sharing this!

When debugging, I often use console.trace() within a conditional breakpoint. Since it doesn’t have a return value, it won’t pause execution like a debugger would, but it allows me to add trace logs almost anywhere. This is especially helpful when working with third-party libraries interacting with my code, as it doesn’t require recompiling.

Collapse
 
juniourrau profile image
Ravin Rau

Thank you very much @rohitkhokhar, I am surprised that many people were not talking about the console.trace and there weren't many articles about it either. So I decided to do a write-up and share about it.

Collapse
 
rohitkhokhar profile image
Rohit Khokhar

That's great! Keep it up!

Collapse
 
oculus42 profile image
Samuel Rouse

I love to see articles about console.trace()! Thanks for posting this!

When troubleshooting I sometimes put console.trace() in a conditional breakpoint. Because it has no return value, it doesn't pause like a debugger but allows you to add tracing almost anywhere – even in third-party libraries that may be interacting with your code – without recompiling.

Collapse
 
juniourrau profile image
Ravin Rau

Oh wow, that is a wonderful trick—conditional breakpoint and console.trace. Thank you very much for sharing this. Will give it a try.

Collapse
 
souvikinator profile image
Souvik Kar Mahapatra

Have recently started using console.trace(), often use when I'm trying to track down complex issues, especially when dealing with nested function calls or multiple services interacting or recursive calls. Great post btw :)

Collapse
 
juniourrau profile image
Ravin Rau

Thank you very much @souvikinator. Yup, it is always handy when it comes to tracking down the nested function calls or multiple service interacting.

Collapse
 
hosseinyazdi profile image
Hossein Yazdi

Great guide Ravin, thanks!

To add on for devs here, these are some useful debugging tools worth knowing:

Collapse
 
juniourrau profile image
Ravin Rau

Thank you very much @hosseinyazdi for the tool recommendation. Will look into those too.

Collapse
 
hosseinyazdi profile image
Hossein Yazdi

You're welcome, thank you too! 😉

Collapse
 
nagesh_gunji_7020fb5d963d profile image
Nagesh Gunji

Thanks for sharing this

Collapse
 
juniourrau profile image
Ravin Rau

Thank you very much @nagesh_gunji_7020fb5d963d

Collapse
 
abdullah_nadir profile image
Abdullah Nadir

Thanks for sharing ❣️

Collapse
 
juniourrau profile image
Ravin Rau

Thank you very much @abdullah_nadir.

Collapse
 
ches profile image
CB

Thank you for this! I will try this at work :)

Collapse
 
juniourrau profile image
Ravin Rau

Thank you very much, do try and tell me how it improved your debugging experiences.

Collapse
 
bipin_kumarsinha_39ea823 profile image
BIPIN KUMAR SINHA

Thanks... nicely explain.

Collapse
 
juniourrau profile image
Ravin Rau

Thank you very much @bipin_kumarsinha_39ea823

Collapse
 
annavajjala_nikethsandil profile image
Annavajjala Niketh sandiliya

Thank you for sharing this