third_party.pigweed.src/pw_thread/pw_thread_protos/thread.proto
J. Silva 06f856908a pw_thread: Add estimated max stack usage support
This adds a estimated max or stack usage to the thread snapshot proto.
For the embOS thread backend, store the max stack pointer in the new
field.

Fix: b/199208763
No-Docs-Update-Reason: Minor enhancement
Testing: Able to for verify by running production SW, forcing a crash,
and retrieving snapshot.
Unit tests are updated and pass.

Change-Id: Iaafe540201d8e7e16b2bfa4e83458893f2ba8dd6
Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/60246
Commit-Queue: Jennifer Silva <jennifersilva@google.com>
Commit-Queue: Keir Mierle <keir@google.com>
Reviewed-by: Armando Montanez <amontanez@google.com>
2021-09-16 01:47:54 +00:00

111 lines
4.5 KiB
Protocol Buffer
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Copyright 2021 The Pigweed Authors
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy of
// the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.
syntax = "proto3";
package pw.thread;
import "pw_tokenizer/proto/options.proto";
option java_package = "pw.thread.proto";
option java_outer_classname = "Thread";
message ThreadState {
enum Enum {
// Thread state is invalid or cannot be expressed by this enum.
UNKNOWN = 0;
// Interrupt handling is often done on a stack that isn't associated with a
// true RTOS thread. This state indicates the provided thread info is for an
// interrupt handler.
INTERRUPT_HANDLER = 1;
// This is the currently active thread as marked by the RTOS. In crashes in
// interrupt contexts, this isnt necessarily the thread that crashed.
RUNNING = 2;
// Thread is ready to run, but isnt currently running.
READY = 3;
// The thread is not ready to run, and will not be ready to run until it is
// explicitly resumed.
SUSPENDED = 4;
// The thread is waiting on something before it can run again.
BLOCKED = 5;
// The thread is either not yet initialized, or has terminated. In other
// words, this thread is a suspended thread that cannot be unsuspended.
INACTIVE = 6;
}
}
message Thread {
// Thread names must be unique; this allows extensions of Snapshot to augment
// threads with additional data. This should either be human readable text, or
// tokenized data (e.g. base-64 encoded or binary data).
bytes name = 1 [(tokenizer.format) = TOKENIZATION_OPTIONAL];
// Whether or not this thread is the thread is the currently active context
// at the time of capture. For multi-thread dumps, this field should only be
// set on ONE thread.
//
// Note: in interrupt contexts, the active thread may not be the thread that
// is in the THREAD_STATE_RUNNING state.
bool active = 2;
// A summarized thread state. RTOS-specific extensions of the Thread message
// may provide more specific thread state information.
ThreadState.Enum state = 3;
// Contents of a stack trace. It is expected that this stack is pre-walked,
// and contains addresses. Most recent stack events are at the beginning of
// the captured stack trace.
repeated uint64 raw_backtrace = 4;
// Results of symbolizing stack_entries. This is usually not provided by the
// device, but instead by server/host side processing.
repeated string symbolized_backtrace = 5;
// This should contain the raw contents of the thread's stack. This might not
// match stack_size. It can be larger due to a stack overflow, or smaller due
// to the implementation deciding to only capture a portion of the stack.
// Partial stack captures are typically a result of storage/memory
// limitations.
bytes raw_stack = 6;
// The address this thread's stack pointer began at. For descending stacks,
// this is the highest address of the stack bounds. For ascending stacks, this
// is the lowest address of the stack bounds.
optional uint64 stack_start_pointer = 7;
// The furthest permitted address from where this thread's stack pointer
// began. For descending stacks, this is the lowest address of the stack
// bounds. For ascending stacks, this is the highest address of the stack
// bounds.
optional uint64 stack_end_pointer = 8;
// The current stack pointer of this thread.
optional uint64 stack_pointer = 9;
// CPU usage info. This is the percentage of CPU time the thread has been
// active in hundredths of a percent. (e.g. 5.00% = 500u)
optional uint32 cpu_usage_hundredths = 10;
// The address of highest estimated currently used in the thread stack.
// Percentage of bytes used can be calculated by:
// (stack_estimate_max_addr-stack_start_pointer) /
// (stack_end_pointer-stack_start_pointer) * 100%
optional uint64 stack_pointer_est_peak = 11;
}
// This message overlays the pw.snapshot.Snapshot proto. It's valid to encode
// this message to the same sink that a Snapshot proto is being written to.
message SnapshotThreadInfo {
repeated pw.thread.Thread threads = 18;
}