Developer Tools

JavaScript Developer Tools: Everything Past console.log

11 min readBy KBC Grandcentral Research Team

The average JavaScript developer uses four browser DevTools features: the console, a few breakpoints, the network tab to check if requests fired, and Lighthouse for a quick audit. That's 4 of roughly 40 tools available. The Performance panel can pinpoint a 400ms render block in 30 seconds. The Memory panel can identify a leak that's been accumulating for days. Most developers reach for console.log first and last.

Chrome DevTools — What Each Panel Actually DoesElementsConsoleSourcesNetworkPerformanceMemoryConsole methods most devs don't use:console.table(data) — renders array of objects as sortable tableconsole.time('label') / console.timeEnd('label') — inline timingconsole.group() / console.groupCollapsed() — collapsible log sectionsconsole.assert(condition, msg) — logs only when condition is falseconsole.count('label') — counts calls with that labelconsole.trace() — prints full call stack at this pointStop Debugging Blind — Use the Right Tool

Key Takeaways

  • console.table() renders any array of objects as a sortable, searchable table — far more readable than console.log for data inspection
  • Conditional breakpoints only pause execution when a condition is true — essential for debugging inside loops without clicking "continue" 500 times
  • Performance panel flame charts identify exactly which function calls are blocking the main thread and for how long
  • Heap snapshots compare memory allocations between two states — the way to find which object type is accumulating in a memory leak
  • Network throttling simulates 3G/4G conditions — reveals performance problems invisible on fast connections

Console Methods You're Probably Not Using

The Console API has 17+ methods. Most developers use three. Here are the ones with the highest practical impact:

High-Value Console Methods:

// Render array of objects as interactive table

console.table(users)

// Shows name, email, role columns in sortable grid

// Time a specific code path

console.time('db-query')

await db.query(sql)

console.timeEnd('db-query')

// Output: "db-query: 43.2ms"

// Log only when something is wrong

console.assert(user.id !== undefined, 'User has no ID', user)

// Group related logs (collapses in console)

console.groupCollapsed('Auth flow')

console.log('token:', token)

console.log('user:', user)

console.groupEnd()

Breakpoints Beyond Line Clicks

Most developers know how to click a line number to set a breakpoint. The advanced breakpoint types are where debugging gets genuinely fast:

Breakpoint TypeHow to SetBest For
ConditionalRight-click line → Add conditionalDebugging inside loops — only pauses when i === 499
LogpointRight-click → Add logpointconsole.log without editing source — logs expression when reached
DOM breakpointsElements panel → right-click node → Break onCatch which JS is modifying a DOM element unexpectedly
XHR/Fetch breakpointsSources → XHR/fetch breakpointsPause when any request matching URL pattern fires
Event listenerSources → Event Listener BreakpointsPause on any click/keypress/scroll handler
Exception breakpointsSources → Pause on exceptions toggleCatch errors exactly where they throw, not where they're caught

Performance Panel: Reading Flame Charts

The Performance panel records a timeline of everything the browser does: JavaScript execution, style recalculations, layout, paint, and composite. The flame chart shows call stacks over time — wider = longer duration, stacked = nested function calls. A long red bar at the top of the main thread means the page is frozen and unresponsive.

The workflow: click Record, interact with the page, stop. Look for the red "Long Task" markers (any task over 50ms). Expand those in the flame chart and find the function at the bottom of the stack that's taking the most time. That's usually the optimization target. Common culprits: large JSON.parse() calls, synchronous localStorage reads in a loop, or unthrottled scroll/resize handlers.

Finding Memory Leaks with Heap Snapshots

A memory leak means objects accumulate in the heap without being garbage collected. The typical cause in React/Vue apps: event listeners attached in useEffect/mounted but not cleaned up, setInterval calls not cleared, or global state stores growing unboundedly. The Memory panel's Heap Snapshot workflow:

Memory Leak Detection Protocol

  1. Take Heap Snapshot 1 (Memory tab → Heap snapshot → Take snapshot)
  2. Perform the action you suspect is leaking (navigate away, close a modal, etc.)
  3. Force garbage collection (⛽ icon in Memory panel)
  4. Take Heap Snapshot 2
  5. Select Snapshot 2 → change view from "Summary" to "Comparison"
  6. Sort by "# Delta" (positive) — objects that grew between snapshots
  7. The object type at the top with the most positive delta is your leak suspect

JavaScript & Developer Tools

Developer Tools Suite

JSON formatter, color converter, URL encoder, hash generator, regex tester, and more developer tools — all in one place without leaving the browser.

Open Developer Tools →