Skip to content

Instantly share code, notes, and snippets.

@hirofumi
Created October 20, 2012 19:13
Show Gist options
  • Save hirofumi/3924376 to your computer and use it in GitHub Desktop.
Save hirofumi/3924376 to your computer and use it in GitHub Desktop.
crash log symbolicator for Jenkins
<?php
define('JENKINS_JOBS_DIRECTORY', '/path/to/your/jenkins/jobs');
define('JENKINS_ARCHIVE_SYMBOL_PATH_PATTERN', '/build/Release-iphoneos/*.app');
$JENKINS_JOBS = array(); // Your Jenkins jobs
// -------- -------- -------- -------- -------- -------- -------- -------- -------- --------
if ($_SERVER['REQUEST_METHOD'] != 'POST') {
echo '<html><body><form method="POST" enctype="multipart/form-data"><input type="file" name="crashlog"><input type="submit"></form></body></html>';
exit;
}
$uploaded = $_FILES['crashlog']['tmp_name'];
if (is_uploaded_file($uploaded)) {
$crashlog_name = $_FILES['crashlog']['name'];
$crashlog_contents = file_get_contents($uploaded);
} else {
header('HTTP/1.0 400 Bad Request');
echo '<html><body>no crashlog given</body></html>';
exit;
}
$paths = array();
foreach($JENKINS_JOBS as $job) {
$dir = JENKINS_JOBS_DIRECTORY . "/$job/builds";
$dh = dir($dir);
if (!$dh) {
continue;
}
$build_numbers = array();
while (($e = $dh->read()) !== false) {
if (preg_match('/^\\d+$/', $e)) {
array_push($build_numbers, intval($e));
}
}
rsort($build_numbers);
foreach ($build_numbers as $n) {
foreach (glob("$dir/$n/archive" . JENKINS_ARCHIVE_SYMBOL_PATH_PATTERN) as $path) {
array_push($paths, $path);
}
}
}
$developer_dir = trim(`xcode-select -print-path`);
putenv('DEVELOPER_DIR=' . $developer_dir);
$iphone_os_platform_dir = "$developer_dir/Platforms/iPhoneOS.platform";
foreach ($paths as $path) {
$uuids = array();
$name = basename($path, '.app');
foreach (explode("\n", `dwarfdump --uuid "$path/$name"`) as $line) {
$matches = array();
if (!preg_match('/^UUID:\s+([0-9A-F-]+)\s+/', $line, $matches)) {
continue;
}
$tag = '<' . strtolower(str_replace('-', '', $matches[1])) . '>';
if (strpos($crashlog_contents, $tag) == false) {
continue;
}
$name = preg_replace('/\\.crash$/', '.symbolicated.crash', $crashlog_name);
$symbolicated = `"$iphone_os_platform_dir/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources/symbolicatecrash" "$uploaded" "$path" "$iphone_os_platform_dir/Developer/SDKs/*"`;
echo '<html><body>';
echo '<a href="data://text/plain;base64,', base64_encode($path . "\n\n" . $symbolicated), '" download="', $name, '">download</a>';
echo '<h1>Matched</h1>';
echo '<pre>', $path, '</pre>';
echo '<h1>Symbolicated</h1>';
echo '<pre>', $symbolicated, '</pre>';
echo '</body></html>';
exit;
}
}
header('HTTP/1.0 400 Bad Request');
echo '<html><body>no executable matched</body></html>';
?>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment