11
11
12
12
13
13
class ProcessSaveCoreMinidumpTestCase (TestBase ):
14
+
15
+ def verify_core_file (self , core_path , expected_pid , expected_modules ,
16
+ expected_threads ):
17
+ # To verify, we'll launch with the mini dump
18
+ target = self .dbg .CreateTarget (None )
19
+ process = target .LoadCore (core_path )
20
+
21
+ # check if the core is in desired state
22
+ self .assertTrue (process , PROCESS_IS_VALID )
23
+ self .assertTrue (process .GetProcessInfo ().IsValid ())
24
+ self .assertEqual (process .GetProcessInfo ().GetProcessID (), expected_pid )
25
+ self .assertTrue (target .GetTriple ().find ("linux" ) != - 1 )
26
+ self .assertTrue (target .GetNumModules (), len (expected_modules ))
27
+ self .assertEqual (process .GetNumThreads (), len (expected_threads ))
28
+
29
+ for module , expected in zip (target .modules , expected_modules ):
30
+ self .assertTrue (module .IsValid ())
31
+ module_file_name = module .GetFileSpec ().GetFilename ()
32
+ expected_file_name = expected .GetFileSpec ().GetFilename ()
33
+ # skip kernel virtual dynamic shared objects
34
+ if "vdso" in expected_file_name :
35
+ continue
36
+ self .assertEqual (module_file_name , expected_file_name )
37
+ self .assertEqual (module .GetUUIDString (), expected .GetUUIDString ())
38
+
39
+ for thread_idx in range (process .GetNumThreads ()):
40
+ thread = process .GetThreadAtIndex (thread_idx )
41
+ self .assertTrue (thread .IsValid ())
42
+ thread_id = thread .GetThreadID ()
43
+ self .assertTrue (thread_id in expected_threads )
44
+ self .dbg .DeleteTarget (target )
45
+
14
46
@skipUnlessArch ("x86_64" )
15
47
@skipUnlessPlatform (["linux" ])
16
48
def test_save_linux_mini_dump (self ):
17
49
"""Test that we can save a Linux mini dump."""
18
50
self .build ()
19
51
exe = self .getBuildArtifact ("a.out" )
20
- core = self .getBuildArtifact ("core.dmp" )
21
- core_sb = self .getBuildArtifact ("core_sb.dmp" )
52
+ core_stack = self .getBuildArtifact ("core.stack.dmp" )
53
+ core_dirty = self .getBuildArtifact ("core.dirty.dmp" )
54
+ core_full = self .getBuildArtifact ("core.full.dmp" )
55
+ core_sb_stack = self .getBuildArtifact ("core_sb.stack.dmp" )
56
+ core_sb_dirty = self .getBuildArtifact ("core_sb.dirty.dmp" )
57
+ core_sb_full = self .getBuildArtifact ("core_sb.full.dmp" )
22
58
try :
23
59
target = self .dbg .CreateTarget (exe )
24
60
process = target .LaunchSimple (
@@ -41,53 +77,68 @@ def test_save_linux_mini_dump(self):
41
77
42
78
# save core and, kill process and verify corefile existence
43
79
self .runCmd (
44
- "process save-core --plugin-name=minidump --style=stack " + core
80
+ "process save-core --plugin-name=minidump --style=stack '%s'" % (core_stack )
81
+ )
82
+ self .assertTrue (os .path .isfile (core_stack ))
83
+ self .verify_core_file (core_stack , expected_pid , expected_modules ,
84
+ expected_threads )
85
+
86
+ self .runCmd (
87
+ "process save-core --plugin-name=minidump --style=modified-memory '%s'" (core_dirty )
88
+ )
89
+ self .assertTrue (os .path .isfile (core_dirty ))
90
+ self .verify_core_file (core_dirty , expected_pid , expected_modules ,
91
+ expected_threads )
92
+
93
+
94
+ self .runCmd (
95
+ "process save-core --plugin-name=minidump --style=full '%s'" (core_full )
45
96
)
46
- self .assertTrue (os .path .isfile (core ))
97
+ self .assertTrue (os .path .isfile (core_full ))
98
+ self .verify_core_file (core_full , expected_pid , expected_modules ,
99
+ expected_threads )
100
+
47
101
48
- # validate savinig via SBProcess
49
- error = process .SaveCore (core_sb , "minidump" , lldb .eSaveCoreStackOnly )
102
+ # validate saving via SBProcess
103
+ error = process .SaveCore (core_sb_stack , "minidump" ,
104
+ lldb .eSaveCoreStackOnly )
50
105
self .assertTrue (error .Success ())
51
- self .assertTrue (os .path .isfile (core_sb ))
106
+ self .assertTrue (os .path .isfile (core_sb_stack ))
107
+ self .verify_core_file (core_sb_stack , expected_pid , expected_modules ,
108
+ expected_threads )
52
109
53
- error = process .SaveCore (core_sb , "minidump" , lldb .eSaveCoreFull )
54
- self .assertTrue (error .Fail ())
55
- error = process .SaveCore (core_sb , "minidump" , lldb .eSaveCoreDirtyOnly )
56
- self .assertTrue (error .Fail ())
57
110
58
- self .assertSuccess (process .Kill ())
111
+ error = process .SaveCore (core_sb_dirty , "minidump" ,
112
+ lldb .eSaveCoreDirtyOnly )
113
+ self .assertTrue (error .Success ())
114
+ self .assertTrue (os .path .isfile (core_sb_dirty ))
115
+ self .verify_core_file (core_sb_dirty , expected_pid , expected_modules ,
116
+ expected_threads )
59
117
60
- # To verify, we'll launch with the mini dump
61
- target = self .dbg .CreateTarget (None )
62
- process = target .LoadCore (core )
63
-
64
- # check if the core is in desired state
65
- self .assertTrue (process , PROCESS_IS_VALID )
66
- self .assertTrue (process .GetProcessInfo ().IsValid ())
67
- self .assertEqual (process .GetProcessInfo ().GetProcessID (), expected_pid )
68
- self .assertTrue (target .GetTriple ().find ("linux" ) != - 1 )
69
- self .assertTrue (target .GetNumModules (), expected_number_of_modules )
70
- self .assertEqual (process .GetNumThreads (), expected_number_of_threads )
71
-
72
- for module , expected in zip (target .modules , expected_modules ):
73
- self .assertTrue (module .IsValid ())
74
- module_file_name = module .GetFileSpec ().GetFilename ()
75
- expected_file_name = expected .GetFileSpec ().GetFilename ()
76
- # skip kernel virtual dynamic shared objects
77
- if "vdso" in expected_file_name :
78
- continue
79
- self .assertEqual (module_file_name , expected_file_name )
80
- self .assertEqual (module .GetUUIDString (), expected .GetUUIDString ())
118
+ # Minidump can now save full core files, but they will be huge and
119
+ # they might cause this test to timeout.
120
+ error = process .SaveCore (core_sb_full , "minidump" ,
121
+ lldb .eSaveCoreFull )
122
+ self .assertTrue (error .Success ())
123
+ self .assertTrue (os .path .isfile (core_sb_full ))
124
+ self .verify_core_file (core_sb_full , expected_pid , expected_modules ,
125
+ expected_threads )
81
126
82
- for thread_idx in range (process .GetNumThreads ()):
83
- thread = process .GetThreadAtIndex (thread_idx )
84
- self .assertTrue (thread .IsValid ())
85
- thread_id = thread .GetThreadID ()
86
- self .assertTrue (thread_id in expected_threads )
127
+ self .assertSuccess (process .Kill ())
87
128
finally :
88
129
# Clean up the mini dump file.
89
130
self .assertTrue (self .dbg .DeleteTarget (target ))
90
131
if os .path .isfile (core ):
91
132
os .unlink (core )
92
- if os .path .isfile (core_sb ):
93
- os .unlink (core_sb )
133
+ if os .path .isfile (core_stack ):
134
+ os .unlink (core_stack )
135
+ if os .path .isfile (core_dirty ):
136
+ os .unlink (core_dirty )
137
+ if os .path .isfile (core_full ):
138
+ os .unlink (core_full )
139
+ if os .path .isfile (core_sb_stack ):
140
+ os .unlink (core_sb_stack )
141
+ if os .path .isfile (core_sb_dirty ):
142
+ os .unlink (core_sb_dirty )
143
+ if os .path .isfile (core_sb_full ):
144
+ os .unlink (core_sb_full )
0 commit comments