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

Ravin Rau @juniourrau

About: Curiosity makes exploring more interesting. A JavaScript avid with so many questions about life.

Location:
Kuala Lumpur, Malaysia
Joined:
May 8, 2021

🦸 Supercharge your debugging skills with the console.trace

Publish Date: Dec 13 '24
122 22

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!

Comments 22 total

  • CB
    CBDec 13, 2024

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

    • Ravin Rau
      Ravin RauDec 14, 2024

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

  • Samuel Rouse
    Samuel RouseDec 13, 2024

    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.

    • Ravin Rau
      Ravin RauDec 14, 2024

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

  • Rohit Khokhar
    Rohit KhokharDec 14, 2024

    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.

    • Ravin Rau
      Ravin RauDec 14, 2024

      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.

  • АнонимDec 14, 2024

    [deleted]

    • Ravin Rau
      Ravin RauDec 14, 2024

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

  • Souvik Kar Mahapatra
    Souvik Kar MahapatraDec 14, 2024

    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 :)

    • Ravin Rau
      Ravin RauDec 14, 2024

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

  • Nagesh Gunji
    Nagesh GunjiDec 15, 2024

    Thanks for sharing this

  • Abdullah Nadir
    Abdullah NadirDec 15, 2024

    Thanks for sharing ❣️

  • BIPIN KUMAR SINHA
    BIPIN KUMAR SINHADec 16, 2024

    Thanks... nicely explain.

  • Annavajjala Niketh sandiliya
    Annavajjala Niketh sandiliyaDec 18, 2024

    Thank you for sharing this

  • Gabriel Rowan
    Gabriel RowanDec 19, 2024

    Nice, I didn't know about console.trace - thanks! 😄

  • Amit Kumar
    Amit KumarApr 4, 2025

    Thanks for sharing. Reading the other comments, about the conditional breakpoint alongside, seems really useful for debugging, will try it out.

Add comment