Skip to main content
Glama

get_stack_trace

Retrieve and analyze thread stack traces from Java processes to diagnose performance issues, identify blocking threads, and monitor JVM application behavior.

Instructions

获取线程堆栈信息

        Args:
            pid (str): 进程ID,使用字符串形式(如:"12345")
            thread_id (str): 线程ID,使用字符串形式。支持十六进制(如:"0x2c03")
            top_n (str): 显示前N个线程,使用字符串形式(如:"5"),默认值为"5"
            find_blocking (bool): 是否只查找阻塞线程(BLOCKED状态或等待锁的线程)
            interval (str): 采样间隔,使用字符串形式(如:"1000"表示1秒)
            show_all (bool): 是否显示所有信息

        Returns:
            Dict: 包含线程堆栈信息的字典,包含以下字段:
                - threads (List[Dict]): 线程信息列表
                - thread_count (int): 线程数量
                - raw_output (str): 原始输出
                - timestamp (float): 时间戳
                - success (bool): 是否成功
                - error (Optional[str]): 错误信息
        

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
pidNo
thread_idNo
top_nNo5
find_blockingNo
intervalNo
show_allNo

Implementation Reference

  • Primary handler implementation for the 'get_stack_trace' tool. Validates PID and parameters, executes JstackCommand to dump threads, filters by blocking status, specific thread ID, or top N threads, and returns structured thread information.
    @self.mcp.tool()
    def get_stack_trace(pid: str = "", 
                        thread_id: str = "", 
                        top_n: str = "5", 
                        find_blocking: bool = False, 
                        interval: str = "", 
                        show_all: bool = False) -> Dict:
        """获取线程堆栈信息
        
        Args:
            pid (str): 进程ID,使用字符串形式(如:"12345")
            thread_id (str): 线程ID,使用字符串形式。支持十六进制(如:"0x2c03")
            top_n (str): 显示前N个线程,使用字符串形式(如:"5"),默认值为"5"
            find_blocking (bool): 是否只查找阻塞线程(BLOCKED状态或等待锁的线程)
            interval (str): 采样间隔,使用字符串形式(如:"1000"表示1秒)
            show_all (bool): 是否显示所有信息
    
        Returns:
            Dict: 包含线程堆栈信息的字典,包含以下字段:
                - threads (List[Dict]): 线程信息列表
                - thread_count (int): 线程数量
                - raw_output (str): 原始输出
                - timestamp (float): 时间戳
                - success (bool): 是否成功
                - error (Optional[str]): 错误信息
        """
        
        try:
            validated_pid = self._validate_and_convert_id(pid if pid else None, "process ID")
            if validated_pid is None:
                return {
                    "raw_output": "",
                    "timestamp": time.time(),
                    "success": False,
                    "error": "Invalid process ID"
                }
            
            validated_thread_id = self._validate_and_convert_id(thread_id if thread_id else None, "thread ID")
            validated_top_n = self._validate_and_convert_id(top_n if top_n else None, "top_n")
            # 设置默认值
            if validated_top_n is None:
                validated_top_n = 5
                
        except ValueError as e:
            return {
                "raw_output": "",
                "timestamp": time.time(),
                "success": False,
                "error": str(e)
            }
        
        cmd = JstackCommand(self.executor, JstackFormatter())
        result = cmd.execute(str(validated_pid))
        
        if not result.get('success', False):
            return {
                "threads": [],
                "thread_count": 0,
                "raw_output": result.get('output', ''),
                "timestamp": time.time(),
                "success": False,
                "error": result.get('error', 'Failed to execute jstack command')
            }
        
        threads = result.get('threads', [])
        
        # 处理 find_blocking:筛选阻塞线程
        if find_blocking:
            blocking_threads = []
            for thread in threads:
                state = thread.get('state', '').upper()
                locks = thread.get('locks', [])
                
                # 检查是否为阻塞状态
                is_blocked = (
                    'BLOCKED' in state or
                    any('waiting to lock' in lock.lower() for lock in locks) or
                    any('parking to wait' in lock.lower() for lock in locks)
                )
                
                if is_blocked:
                    blocking_threads.append(thread)
            
            threads = blocking_threads
        
        # 处理 thread_id:筛选指定线程
        if validated_thread_id is not None:
            target_threads = []
            # 支持十进制和十六进制
            target_nid_hex = hex(validated_thread_id) if isinstance(validated_thread_id, int) else str(validated_thread_id)
            target_nid_dec = str(validated_thread_id)
            
            for thread in threads:
                thread_nid = thread.get('nid', '')
                thread_tid = thread.get('thread_id')
                
                # 匹配nid(十六进制)或thread_id(十进制)
                if (thread_nid == target_nid_hex or 
                    thread_nid == target_nid_dec or
                    thread_tid == validated_thread_id):
                    target_threads.append(thread)
            
            threads = target_threads
        
        # 处理 top_n:取前N个线程
        if validated_top_n is not None and validated_top_n > 0:
            threads = threads[:validated_top_n]
        
        # 返回格式化后的结果,包含 threads 字段
        return {
            "threads": threads,
            "thread_count": len(threads),
            "raw_output": result.get('output', ''),
            "timestamp": time.time(),
            "success": True,
            "error": None
        }
  • Helper method used by get_stack_trace to validate and convert string PIDs, thread_ids, top_n to integers, supporting hexadecimal format.
    def _validate_and_convert_id(self, value: Union[int, str, None], param_name: str = "ID") -> Optional[int]:
        """
        验证并转换ID参数,支持int和str类型的数字参数
        
        Args:
            value: 要转换的值,可以是int、str或None
            param_name: 参数名称,用于错误信息
            
        Returns:
            转换后的整数值,如果输入为None则返回None
            
        Raises:
            ValueError: 如果无法转换为有效的整数
        """
        if value is None:
            return None
            
        if isinstance(value, int):
            return value
            
        if isinstance(value, str):
            # 去除前后空白字符
            value = value.strip()
            if not value:
                return None
                
            try:
                # 支持十六进制格式(如0x2c03)和十进制格式
                if value.lower().startswith('0x'):
                    return int(value, 16)
                else:
                    return int(value)
            except ValueError:
                raise ValueError(f"Invalid {param_name}: '{value}' cannot be converted to integer")
        
        raise ValueError(f"Invalid {param_name} type: expected int, str or None, got {type(value)}")
  • Registration of the get_stack_trace tool using the FastMCP decorator.
    @self.mcp.tool()

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/xzq-xu/jvm-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server