================
@@ -234,6 +245,155 @@ lldb::addr_t ProcessFreeBSDKernel::FindSymbol(const char
*name) {
return sym ? sym->GetLoadAddress(&GetTarget()) : LLDB_INVALID_ADDRESS;
}
+void ProcessFreeBSDKernel::PrintUnreadMessage() {
+ Target &target = GetTarget();
+ Debugger &debugger = target.GetDebugger();
+
+ if (!debugger.GetCommandInterpreter().IsInteractive())
+ return;
+
+ Status error;
+
+ // Find msgbufp symbol (pointer to message buffer)
+ lldb::addr_t msgbufp_addr = FindSymbol("msgbufp");
+ if (msgbufp_addr == LLDB_INVALID_ADDRESS)
+ return;
+
+ // Read the pointer value
+ lldb::addr_t msgbufp = ReadPointerFromMemory(msgbufp_addr, error);
+ if (!error.Success() || msgbufp == LLDB_INVALID_ADDRESS)
+ return;
+
+ // Get the type information for struct msgbuf from DWARF
+ TypeQuery query("msgbuf");
+ TypeResults results;
+ target.GetImages().FindTypes(nullptr, query, results);
+
+ uint64_t offset_msg_ptr = 0;
+ uint64_t offset_msg_size = 0;
+ uint64_t offset_msg_wseq = 0;
+ uint64_t offset_msg_rseq = 0;
+
+ if (results.GetTypeMap().GetSize() > 0) {
+ // Found type info - use it to get field offsets
+ CompilerType msgbuf_type =
+ results.GetTypeMap().GetTypeAtIndex(0)->GetForwardCompilerType();
+
+ uint32_t num_fields = msgbuf_type.GetNumFields();
+ int field_found = 0;
+ for (uint32_t i = 0; i < num_fields; i++) {
+ std::string field_name;
+ uint64_t field_offset = 0;
+ uint32_t field_bitfield_bit_size = 0;
+ bool field_is_bitfield = false;
+
+ msgbuf_type.GetFieldAtIndex(i, field_name, &field_offset,
+ &field_bitfield_bit_size,
&field_is_bitfield);
+
+ if (field_name == "msg_ptr") {
+ offset_msg_ptr = field_offset / 8; // Convert bits to bytes
+ field_found++;
+ } else if (field_name == "msg_size") {
+ offset_msg_size = field_offset / 8;
+ field_found++;
+ } else if (field_name == "msg_wseq") {
+ offset_msg_wseq = field_offset / 8;
+ field_found++;
+ } else if (field_name == "msg_rseq") {
+ offset_msg_rseq = field_offset / 8;
+ field_found++;
+ }
+ }
+
+ if (field_found != 4) {
+ LLDB_LOGF(GetLog(LLDBLog::Object),
----------------
mchoo7 wrote:
I think it's better to return early rather than trying to read hardcoded
because it means dwarf is already messed up but falling back to hardcode hides
that issue. This is a function that just prints kernel messages and doens't
involve any of core debugging functionalities, so early return is fine here.
https://github.com/llvm/llvm-project/pull/178027
_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits