OLD | NEW |
1 // Copyright (c) 2010 The Chromium OS Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium OS Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <unistd.h> | 5 #include <unistd.h> |
6 | 6 |
7 #include "base/file_util.h" | 7 #include "base/file_util.h" |
8 #include "base/string_util.h" | 8 #include "base/string_util.h" |
9 #include "chromeos/syslog_logging.h" | 9 #include "chromeos/syslog_logging.h" |
10 #include "chromeos/test_helpers.h" | 10 #include "chromeos/test_helpers.h" |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
43 } | 43 } |
44 protected: | 44 protected: |
45 void WriteStringToFile(const FilePath &file_path, | 45 void WriteStringToFile(const FilePath &file_path, |
46 const char *data) { | 46 const char *data) { |
47 ASSERT_EQ(strlen(data), | 47 ASSERT_EQ(strlen(data), |
48 file_util::WriteFile(file_path, data, strlen(data))); | 48 file_util::WriteFile(file_path, data, strlen(data))); |
49 } | 49 } |
50 | 50 |
51 void SetUpSuccessfulCollect(); | 51 void SetUpSuccessfulCollect(); |
52 void CheckPreservedDumpClear(); | 52 void CheckPreservedDumpClear(); |
| 53 void ComputeKernelStackSignatureCommon(); |
53 | 54 |
54 KernelCollector collector_; | 55 KernelCollector collector_; |
55 FilePath test_kcrash_; | 56 FilePath test_kcrash_; |
56 }; | 57 }; |
57 | 58 |
| 59 TEST_F(KernelCollectorTest, ComputeKernelStackSignatureBase) { |
| 60 // Make sure the normal build architecture is detected |
| 61 EXPECT_TRUE(collector_.GetArch() != KernelCollector::archUnknown); |
| 62 } |
| 63 |
58 TEST_F(KernelCollectorTest, LoadPreservedDump) { | 64 TEST_F(KernelCollectorTest, LoadPreservedDump) { |
59 ASSERT_FALSE(file_util::PathExists(test_kcrash_)); | 65 ASSERT_FALSE(file_util::PathExists(test_kcrash_)); |
60 std::string dump; | 66 std::string dump; |
61 ASSERT_FALSE(collector_.LoadPreservedDump(&dump)); | 67 ASSERT_FALSE(collector_.LoadPreservedDump(&dump)); |
62 WriteStringToFile(test_kcrash_, ""); | 68 WriteStringToFile(test_kcrash_, ""); |
63 ASSERT_TRUE(collector_.LoadPreservedDump(&dump)); | 69 ASSERT_TRUE(collector_.LoadPreservedDump(&dump)); |
64 ASSERT_EQ("", dump); | 70 ASSERT_EQ("", dump); |
65 WriteStringToFile(test_kcrash_, "something"); | 71 WriteStringToFile(test_kcrash_, "something"); |
66 ASSERT_TRUE(collector_.LoadPreservedDump(&dump)); | 72 ASSERT_TRUE(collector_.LoadPreservedDump(&dump)); |
67 ASSERT_EQ("something", dump); | 73 ASSERT_EQ("something", dump); |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
155 filename = filename.substr(0, end_pos); | 161 filename = filename.substr(0, end_pos); |
156 ASSERT_EQ(0, filename.find(kTestCrashDirectory)); | 162 ASSERT_EQ(0, filename.find(kTestCrashDirectory)); |
157 ASSERT_TRUE(file_util::PathExists(FilePath(filename))); | 163 ASSERT_TRUE(file_util::PathExists(FilePath(filename))); |
158 std::string contents; | 164 std::string contents; |
159 ASSERT_TRUE(file_util::ReadFileToString(FilePath(filename), &contents)); | 165 ASSERT_TRUE(file_util::ReadFileToString(FilePath(filename), &contents)); |
160 ASSERT_EQ("something", contents); | 166 ASSERT_EQ("something", contents); |
161 | 167 |
162 CheckPreservedDumpClear(); | 168 CheckPreservedDumpClear(); |
163 } | 169 } |
164 | 170 |
165 TEST_F(KernelCollectorTest, ComputeKernelStackSignature) { | 171 // Perform tests which are common across architectures |
| 172 void KernelCollectorTest::ComputeKernelStackSignatureCommon() { |
| 173 std::string signature; |
| 174 |
| 175 const char kStackButNoPC[] = |
| 176 "<4>[ 6066.829029] [<790340af>] __do_softirq+0xa6/0x143\n"; |
| 177 EXPECT_TRUE( |
| 178 collector_.ComputeKernelStackSignature(kStackButNoPC, &signature, false)); |
| 179 EXPECT_EQ("kernel--83615F0A", signature); |
| 180 |
| 181 const char kMissingEverything[] = |
| 182 "<4>[ 6066.829029] [<790340af>] ? __do_softirq+0xa6/0x143\n"; |
| 183 EXPECT_FALSE( |
| 184 collector_.ComputeKernelStackSignature(kMissingEverything, |
| 185 &signature, |
| 186 false)); |
| 187 |
| 188 // Long message. |
| 189 const char kTruncatedMessage[] = |
| 190 "<0>[ 87.485611] Kernel panic - not syncing: 01234567890123456789" |
| 191 "01234567890123456789X\n"; |
| 192 EXPECT_TRUE( |
| 193 collector_.ComputeKernelStackSignature(kTruncatedMessage, |
| 194 &signature, |
| 195 false)); |
| 196 EXPECT_EQ("kernel-0123456789012345678901234567890123456789-00000000", |
| 197 signature); |
| 198 } |
| 199 |
| 200 TEST_F(KernelCollectorTest, ComputeKernelStackSignatureARM) { |
| 201 const char kBugToPanic[] = |
| 202 "<5>[ 123.412524] Modules linked in:\n" |
| 203 "<5>[ 123.412534] CPU: 0 Tainted: G W " |
| 204 "(2.6.37-01030-g51cee64 #153)\n" |
| 205 "<5>[ 123.412552] PC is at write_breakme+0xd0/0x1b4\n" |
| 206 "<5>[ 123.412560] LR is at write_breakme+0xc8/0x1b4\n" |
| 207 "<5>[ 123.412569] pc : [<c0058220>] lr : [<c005821c>] " |
| 208 "psr: 60000013\n" |
| 209 "<5>[ 123.412574] sp : f4e0ded8 ip : c04d104c fp : 000e45e0\n" |
| 210 "<5>[ 123.412581] r10: 400ff000 r9 : f4e0c000 r8 : 00000004\n" |
| 211 "<5>[ 123.412589] r7 : f4e0df80 r6 : f4820c80 r5 : 00000004 " |
| 212 "r4 : f4e0dee8\n" |
| 213 "<5>[ 123.412598] r3 : 00000000 r2 : f4e0decc r1 : c05f88a9 " |
| 214 "r0 : 00000039\n" |
| 215 "<5>[ 123.412608] Flags: nZCv IRQs on FIQs on Mode SVC_32 ISA " |
| 216 "ARM Segment user\n" |
| 217 "<5>[ 123.412617] Control: 10c53c7d Table: 34dcc04a DAC: 00000015\n" |
| 218 "<0>[ 123.412626] Process bash (pid: 1014, stack limit = 0xf4e0c2f8)\n" |
| 219 "<0>[ 123.412634] Stack: (0xf4e0ded8 to 0xf4e0e000)\n" |
| 220 "<0>[ 123.412641] dec0: " |
| 221 " f4e0dee8 c0183678\n" |
| 222 "<0>[ 123.412654] dee0: 00000000 00000000 00677562 0000081f c06a6a78 " |
| 223 "400ff000 f4e0dfb0 00000000\n" |
| 224 "<0>[ 123.412666] df00: bec7ab44 000b1719 bec7ab0c c004f498 bec7a314 " |
| 225 "c024acc8 00000001 c018359c\n" |
| 226 "<0>[ 123.412679] df20: f4e0df34 c04d10fc f5803c80 271beb39 000e45e0 " |
| 227 "f5803c80 c018359c c017bfe0\n" |
| 228 "<0>[ 123.412691] df40: 00000004 f4820c80 400ff000 f4e0df80 00000004 " |
| 229 "f4e0c000 00000000 c01383e4\n" |
| 230 "<0>[ 123.412703] df60: f4820c80 400ff000 f4820c80 400ff000 00000000 " |
| 231 "00000000 00000004 c0138578\n" |
| 232 "<0>[ 123.412715] df80: 00000000 00000000 00000004 00000000 00000004 " |
| 233 "402f95d0 00000004 00000004\n" |
| 234 "<0>[ 123.412727] dfa0: c0054984 c00547c0 00000004 402f95d0 00000001 " |
| 235 "400ff000 00000004 00000000\n" |
| 236 "<0>[ 123.412739] dfc0: 00000004 402f95d0 00000004 00000004 400ff000 " |
| 237 "000c194c bec7ab58 000e45e0\n" |
| 238 "<0>[ 123.412751] dfe0: 00000000 bec7aad8 40232520 40284e9c 60000010 " |
| 239 "00000001 00000000 00000000\n" |
| 240 "<5>[ 39.496577] Backtrace:\n" |
| 241 "<5>[ 123.412782] [<c0058220>] (__bug+0x20/0x2c) from [<c0183678>] " |
| 242 "(write_breakme+0xdc/0x1bc)\n" |
| 243 "<5>[ 123.412798] [<c0183678>] (write_breakme+0xdc/0x1bc) from " |
| 244 "[<c017bfe0>] (proc_reg_write+0x88/0x9c)\n"; |
| 245 std::string signature; |
| 246 |
| 247 collector_.SetArch(KernelCollector::archArm); |
| 248 EXPECT_TRUE( |
| 249 collector_.ComputeKernelStackSignature(kBugToPanic, &signature, false)); |
| 250 EXPECT_EQ("kernel-write_breakme-97D3E92F", signature); |
| 251 |
| 252 ComputeKernelStackSignatureCommon(); |
| 253 } |
| 254 |
| 255 |
| 256 TEST_F(KernelCollectorTest, ComputeKernelStackSignatureX86) { |
166 const char kBugToPanic[] = | 257 const char kBugToPanic[] = |
167 "<4>[ 6066.829029] [<79039d16>] ? run_timer_softirq+0x165/0x1e6\n" | 258 "<4>[ 6066.829029] [<79039d16>] ? run_timer_softirq+0x165/0x1e6\n" |
168 "<4>[ 6066.829029] [<790340af>] ignore_old_stack+0xa6/0x143\n" | 259 "<4>[ 6066.829029] [<790340af>] ignore_old_stack+0xa6/0x143\n" |
169 "<0>[ 6066.829029] EIP: [<b82d7c15>] ieee80211_stop_tx_ba_session+" | 260 "<0>[ 6066.829029] EIP: [<b82d7c15>] ieee80211_stop_tx_ba_session+" |
170 "0xa3/0xb5 [mac80211] SS:ESP 0068:7951febc\n" | 261 "0xa3/0xb5 [mac80211] SS:ESP 0068:7951febc\n" |
171 "<0>[ 6066.829029] CR2: 00000000323038a7\n" | 262 "<0>[ 6066.829029] CR2: 00000000323038a7\n" |
172 "<4>[ 6066.845422] ---[ end trace 12b058bb46c43500 ]---\n" | 263 "<4>[ 6066.845422] ---[ end trace 12b058bb46c43500 ]---\n" |
173 "<0>[ 6066.845747] Kernel panic - not syncing: Fatal exception " | 264 "<0>[ 6066.845747] Kernel panic - not syncing: Fatal exception " |
174 "in interrupt\n" | 265 "in interrupt\n" |
175 "<0>[ 6066.846902] Call Trace:\n" | 266 "<0>[ 6066.846902] Call Trace:\n" |
176 "<4>[ 6066.846902] [<7937a07b>] ? printk+0x14/0x19\n" | 267 "<4>[ 6066.846902] [<7937a07b>] ? printk+0x14/0x19\n" |
177 "<4>[ 6066.949779] [<79379fc1>] panic+0x3e/0xe4\n" | 268 "<4>[ 6066.949779] [<79379fc1>] panic+0x3e/0xe4\n" |
178 "<4>[ 6066.949971] [<7937c5c5>] oops_end+0x73/0x81\n" | 269 "<4>[ 6066.949971] [<7937c5c5>] oops_end+0x73/0x81\n" |
179 "<4>[ 6066.950208] [<7901b260>] no_context+0x10d/0x117\n"; | 270 "<4>[ 6066.950208] [<7901b260>] no_context+0x10d/0x117\n"; |
180 std::string signature; | 271 std::string signature; |
| 272 |
| 273 collector_.SetArch(KernelCollector::archX86); |
181 EXPECT_TRUE( | 274 EXPECT_TRUE( |
182 collector_.ComputeKernelStackSignature(kBugToPanic, &signature, false)); | 275 collector_.ComputeKernelStackSignature(kBugToPanic, &signature, false)); |
183 EXPECT_EQ("kernel-ieee80211_stop_tx_ba_session-DE253569", signature); | 276 EXPECT_EQ("kernel-ieee80211_stop_tx_ba_session-DE253569", signature); |
184 | 277 |
185 const char kPCButNoStack[] = | 278 const char kPCButNoStack[] = |
186 "<0>[ 6066.829029] EIP: [<b82d7c15>] ieee80211_stop_tx_ba_session+"; | 279 "<0>[ 6066.829029] EIP: [<b82d7c15>] ieee80211_stop_tx_ba_session+"; |
187 EXPECT_TRUE( | 280 EXPECT_TRUE( |
188 collector_.ComputeKernelStackSignature(kPCButNoStack, &signature, false)); | 281 collector_.ComputeKernelStackSignature(kPCButNoStack, &signature, false)); |
189 EXPECT_EQ("kernel-ieee80211_stop_tx_ba_session-00000000", signature); | 282 EXPECT_EQ("kernel-ieee80211_stop_tx_ba_session-00000000", signature); |
190 | 283 |
191 const char kStackButNoPC[] = | |
192 "<4>[ 6066.829029] [<790340af>] __do_softirq+0xa6/0x143\n"; | |
193 EXPECT_TRUE( | |
194 collector_.ComputeKernelStackSignature(kStackButNoPC, &signature, false)); | |
195 EXPECT_EQ("kernel--83615F0A", signature); | |
196 | |
197 const char kMissingEverything[] = | |
198 "<4>[ 6066.829029] [<790340af>] ? __do_softirq+0xa6/0x143\n"; | |
199 EXPECT_FALSE( | |
200 collector_.ComputeKernelStackSignature(kMissingEverything, | |
201 &signature, | |
202 false)); | |
203 | |
204 const char kBreakmeBug[] = | 284 const char kBreakmeBug[] = |
205 "<4>[ 180.492137] [<790970c6>] ? handle_mm_fault+0x67f/0x96d\n" | 285 "<4>[ 180.492137] [<790970c6>] ? handle_mm_fault+0x67f/0x96d\n" |
206 "<4>[ 180.492137] [<790dcdfe>] ? proc_reg_write+0x5f/0x73\n" | 286 "<4>[ 180.492137] [<790dcdfe>] ? proc_reg_write+0x5f/0x73\n" |
207 "<4>[ 180.492137] [<790e2224>] ? write_breakme+0x0/0x108\n" | 287 "<4>[ 180.492137] [<790e2224>] ? write_breakme+0x0/0x108\n" |
208 "<4>[ 180.492137] [<790dcd9f>] ? proc_reg_write+0x0/0x73\n" | 288 "<4>[ 180.492137] [<790dcd9f>] ? proc_reg_write+0x0/0x73\n" |
209 "<4>[ 180.492137] [<790ac0aa>] vfs_write+0x85/0xe4\n" | 289 "<4>[ 180.492137] [<790ac0aa>] vfs_write+0x85/0xe4\n" |
210 "<0>[ 180.492137] Code: c6 44 05 b2 00 89 d8 e8 0c ef 09 00 85 c0 75 " | 290 "<0>[ 180.492137] Code: c6 44 05 b2 00 89 d8 e8 0c ef 09 00 85 c0 75 " |
211 "0b c7 00 00 00 00 00 e9 8e 00 00 00 ba e6 75 4b 79 89 d8 e8 f1 ee 09 " | 291 "0b c7 00 00 00 00 00 e9 8e 00 00 00 ba e6 75 4b 79 89 d8 e8 f1 ee 09 " |
212 "00 85 c0 75 04 <0f> 0b eb fe ba 58 47 49 79 89 d8 e8 dd ee 09 00 85 " | 292 "00 85 c0 75 04 <0f> 0b eb fe ba 58 47 49 79 89 d8 e8 dd ee 09 00 85 " |
213 "c0 75 0a 68\n" | 293 "c0 75 0a 68\n" |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
248 "C 2.6.32.23+drm33.10 #1\n" | 328 "C 2.6.32.23+drm33.10 #1\n" |
249 "<4>[ 87.485639] Call Trace:\n" | 329 "<4>[ 87.485639] Call Trace:\n" |
250 "<4>[ 87.485660] [<8133f71d>] ? printk+0x14/0x17\n" | 330 "<4>[ 87.485660] [<8133f71d>] ? printk+0x14/0x17\n" |
251 "<4>[ 87.485674] [<8133f663>] panic+0x3e/0xe4\n" | 331 "<4>[ 87.485674] [<8133f663>] panic+0x3e/0xe4\n" |
252 "<4>[ 87.485689] [<810d062e>] write_breakme+0xaa/0x124\n"; | 332 "<4>[ 87.485689] [<810d062e>] write_breakme+0xaa/0x124\n"; |
253 EXPECT_TRUE( | 333 EXPECT_TRUE( |
254 collector_.ComputeKernelStackSignature(kExamplePanicOnly, | 334 collector_.ComputeKernelStackSignature(kExamplePanicOnly, |
255 &signature, | 335 &signature, |
256 false)); | 336 false)); |
257 EXPECT_EQ("kernel-Testing panic-E0FC3552", signature); | 337 EXPECT_EQ("kernel-Testing panic-E0FC3552", signature); |
258 | 338 ComputeKernelStackSignatureCommon(); |
259 // Long message. | |
260 const char kTruncatedMessage[] = | |
261 "<0>[ 87.485611] Kernel panic - not syncing: 01234567890123456789" | |
262 "01234567890123456789X\n"; | |
263 EXPECT_TRUE( | |
264 collector_.ComputeKernelStackSignature(kTruncatedMessage, | |
265 &signature, | |
266 false)); | |
267 EXPECT_EQ("kernel-0123456789012345678901234567890123456789-00000000", | |
268 signature); | |
269 | |
270 } | 339 } |
271 | 340 |
272 int main(int argc, char **argv) { | 341 int main(int argc, char **argv) { |
273 SetUpTests(&argc, argv, false); | 342 SetUpTests(&argc, argv, false); |
274 return RUN_ALL_TESTS(); | 343 return RUN_ALL_TESTS(); |
275 } | 344 } |
OLD | NEW |