File tree Expand file tree Collapse file tree 4 files changed +31
-2
lines changed
test/API/functionalities/process_save_core_minidump Expand file tree Collapse file tree 4 files changed +31
-2
lines changed Original file line number Diff line number Diff line change @@ -473,7 +473,8 @@ GetThreadContext_x86_64(RegisterContext *reg_ctx) {
473
473
lldb_private::minidump::MinidumpContext_x86_64_Flags::x86_64_Flag |
474
474
lldb_private::minidump::MinidumpContext_x86_64_Flags::Control |
475
475
lldb_private::minidump::MinidumpContext_x86_64_Flags::Segments |
476
- lldb_private::minidump::MinidumpContext_x86_64_Flags::Integer);
476
+ lldb_private::minidump::MinidumpContext_x86_64_Flags::Integer |
477
+ lldb_private::minidump::MinidumpContext_x86_64_Flags::LLDBSpecific);
477
478
thread_context.rax = read_register_u64 (reg_ctx, " rax" );
478
479
thread_context.rbx = read_register_u64 (reg_ctx, " rbx" );
479
480
thread_context.rcx = read_register_u64 (reg_ctx, " rcx" );
@@ -499,6 +500,8 @@ GetThreadContext_x86_64(RegisterContext *reg_ctx) {
499
500
thread_context.gs = read_register_u64 (reg_ctx, " gs" );
500
501
thread_context.ss = read_register_u64 (reg_ctx, " ss" );
501
502
thread_context.ds = read_register_u64 (reg_ctx, " ds" );
503
+ thread_context.fs_base = read_register_u64 (reg_ctx, " fs_base" );
504
+ thread_context.gs_base = read_register_u64 (reg_ctx, " gs_base" );
502
505
return thread_context;
503
506
}
504
507
Original file line number Diff line number Diff line change @@ -67,6 +67,7 @@ lldb::DataBufferSP lldb_private::minidump::ConvertMinidumpContext_x86_64(
67
67
auto ControlFlag = MinidumpContext_x86_64_Flags::Control;
68
68
auto IntegerFlag = MinidumpContext_x86_64_Flags::Integer;
69
69
auto SegmentsFlag = MinidumpContext_x86_64_Flags::Segments;
70
+ auto LLDBSpecificFlag = MinidumpContext_x86_64_Flags::LLDBSpecific;
70
71
71
72
if ((context_flags & x86_64_Flag) != x86_64_Flag)
72
73
return nullptr ;
@@ -104,6 +105,13 @@ lldb::DataBufferSP lldb_private::minidump::ConvertMinidumpContext_x86_64(
104
105
writeRegister (&context->r15 , result_base, reg_info[lldb_r15_x86_64]);
105
106
}
106
107
108
+ if ((context_flags & LLDBSpecificFlag) == LLDBSpecificFlag) {
109
+ writeRegister (&context->fs_base , result_base,
110
+ reg_info[x86_64_with_base::lldb_fs_base]);
111
+ writeRegister (&context->gs_base , result_base,
112
+ reg_info[x86_64_with_base::lldb_gs_base]);
113
+ }
114
+
107
115
// TODO parse the floating point registers
108
116
109
117
return result_context_buf;
Original file line number Diff line number Diff line change @@ -153,6 +153,11 @@ struct MinidumpContext_x86_64 {
153
153
llvm::support::ulittle64_t last_branch_from_rip;
154
154
llvm::support::ulittle64_t last_exception_to_rip;
155
155
llvm::support::ulittle64_t last_exception_from_rip;
156
+
157
+ // LLDB can save core files and save extra information that isn't available
158
+ // from Google breakpad, or similar, minidump files.
159
+ llvm::support::ulittle64_t fs_base;
160
+ llvm::support::ulittle64_t gs_base;
156
161
};
157
162
158
163
// For context_flags. These values indicate the type of
@@ -168,9 +173,10 @@ enum class MinidumpContext_x86_64_Flags : uint32_t {
168
173
FloatingPoint = x86_64_Flag | 0x00000008 ,
169
174
DebugRegisters = x86_64_Flag | 0x00000010 ,
170
175
XState = x86_64_Flag | 0x00000040 ,
176
+ LLDBSpecific = x86_64_Flag | 0x80000000 ,
171
177
172
178
Full = Control | Integer | FloatingPoint,
173
- All = Full | Segments | DebugRegisters,
179
+ All = Full | Segments | DebugRegisters | LLDBSpecific ,
174
180
175
181
LLVM_MARK_AS_BITMASK_ENUM (/* LargestValue = */ All)
176
182
};
Original file line number Diff line number Diff line change @@ -67,6 +67,18 @@ def verify_core_file(
67
67
self .assertIn (thread_id , stacks_to_registers_map )
68
68
register_val_list = stacks_to_registers_map [thread_id ]
69
69
frame_register_list = frame .GetRegisters ()
70
+ # explicitly verify we collected fs and gs base for x86_64
71
+ explicit_registers = ["fs_base" , "gs_base" ]
72
+ for reg in explicit_registers :
73
+ register = frame_register_list .GetFirstValueByName (reg )
74
+ self .assertNotEqual (None , register )
75
+ self .assertEqual (
76
+ register .GetValueAsUnsigned (),
77
+ stacks_to_registers_map [thread_id ]
78
+ .GetFirstValueByName ("fs_base" )
79
+ .GetValueAsUnsigned (),
80
+ )
81
+
70
82
for x in register_val_list :
71
83
self .assertEqual (
72
84
x .GetValueAsUnsigned (),
You can’t perform that action at this time.
0 commit comments