Skip to content

feat(size): add standalone ELF analysis - #659

Draft
trevor-e wants to merge 1 commit into
mainfrom
telkins/elf-size-analysis
Draft

feat(size): add standalone ELF analysis#659
trevor-e wants to merge 1 commit into
mainfrom
telkins/elf-size-analysis

Conversation

@trevor-e

Copy link
Copy Markdown
Member

Summary

  • auto-detect standalone ELF executables and shared libraries through the existing launchpad size command
  • parse ELF sections and symbols with LIEF, use DWARF for verified C++ class ownership, and fall back to inferred demangled scopes
  • account for file-backed bytes without double counting aliases or overlapping symbols
  • support optional separate debug files through build IDs and .gnu_debuglink
  • emit a dedicated ELF result model and class-level treemap while keeping the app artifact worker limited to Apple and Android inputs

Dependencies

  • add pyelftools==0.33 for DWARF parsing; it is pure Python, has no transitive dependencies, and declares a public-domain license
  • use the platform __cxa_demangle ABI through ctypes instead of adding a demangler package

Test plan

  • .venv/bin/python -m ruff check src tests
  • .venv/bin/python -m ty check --error-on-warning src
  • focused ELF, Apple, Android, CLI, artifact factory, worker boundary, and C++ aggregation tests
  • launchpad size smoke test against the clean-room ELF fixture
  • standalone analysis smoke test against a real stripped ELF shared library

Known limitation

The committed clean-room DWARF fixture has an ET_DYN header but no program headers because it is generated with the macOS cross-compiler without a Linux ELF linker. The parser is also smoke-tested against a fully linked stripped shared library.

@sentry

sentryBot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Size Analysis

1 component analyzed, 1 component processing

iOS Builds

NameConfigurationVersionDownload SizeInstall Size
HackerNews (iOS)
com.emergetools.hackernews
Release3.8 (1)6.5 MB (N/A)9.7 MB (N/A)

Android Builds

NameConfigurationVersionDownload SizeUncompressed Size
Hacker News (Android)
com.emergetools.hackernews
Release1.0.2 (13)Processing... (-)Processing... (-)

Configure launchpad-test-ios status check rules

@sentry

sentryBot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

📲 Install Builds

iOS

🔗 App NameApp IDVersionConfiguration
HackerNewscom.emergetools.hackernews3.8 (1)Release

Android

🔗 App NameApp IDVersionConfiguration
Hacker Newscom.emergetools.hackernews1.0.2 (13)Release

⚙️ launchpad-test-android Build Distribution Settings

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 2 potential issues.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 59bf93e. Configure here.

if "::" not in qualified_name:
return CppNamespaceFunction(namespace="(global)", function_name=qualified_name)
namespace, function_name = qualified_name.rsplit("::", 1)
return CppNamespaceFunction(namespace=namespace, function_name=function_name)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Demangled C++ names split incorrectly

Medium Severity

Ownership is taken from demangled text by cutting at the first ( and the last ::. That breaks operator(), template arguments that contain ::, and demanglings that include a return type, so C++ groups and inferred ELF class owners land on the wrong names.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 59bf93e. Configure here.

if "::" not in qualified_name:
return CppNamespaceFunction(namespace="(global)", function_name=qualified_name)
namespace, function_name = qualified_name.rsplit("::", 1)
return CppNamespaceFunction(namespace=namespace, function_name=function_name)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Apple analysis version not bumped

Medium Severity

C++ symbol grouping for Apple binaries now comes from demangled names instead of mangled nested-name components, which changes namespaces and function buckets. APPLE_ANALYSIS_VERSION stays at 1.2.1, so consumers still treat the new treemap layout as comparable to older reports.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 59bf93e. Configure here.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@trevor-e
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
feat(size): add standalone ELF analysis by trevor-e · Pull Request #659 · getsentry/launchpad · GitHub
Skip to content

feat(size): add standalone ELF analysis - #659

Draft
trevor-e wants to merge 1 commit into
mainfrom
telkins/elf-size-analysis
Draft

feat(size): add standalone ELF analysis#659
trevor-e wants to merge 1 commit into
mainfrom
telkins/elf-size-analysis

Conversation

@trevor-e

Copy link
Copy Markdown
Member

Summary

  • auto-detect standalone ELF executables and shared libraries through the existing launchpad size command
  • parse ELF sections and symbols with LIEF, use DWARF for verified C++ class ownership, and fall back to inferred demangled scopes
  • account for file-backed bytes without double counting aliases or overlapping symbols
  • support optional separate debug files through build IDs and .gnu_debuglink
  • emit a dedicated ELF result model and class-level treemap while keeping the app artifact worker limited to Apple and Android inputs

Dependencies

  • add pyelftools==0.33 for DWARF parsing; it is pure Python, has no transitive dependencies, and declares a public-domain license
  • use the platform __cxa_demangle ABI through ctypes instead of adding a demangler package

Test plan

  • .venv/bin/python -m ruff check src tests
  • .venv/bin/python -m ty check --error-on-warning src
  • focused ELF, Apple, Android, CLI, artifact factory, worker boundary, and C++ aggregation tests
  • launchpad size smoke test against the clean-room ELF fixture
  • standalone analysis smoke test against a real stripped ELF shared library

Known limitation

The committed clean-room DWARF fixture has an ET_DYN header but no program headers because it is generated with the macOS cross-compiler without a Linux ELF linker. The parser is also smoke-tested against a fully linked stripped shared library.

@sentry

sentryBot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Size Analysis

1 component analyzed, 1 component processing

iOS Builds

NameConfigurationVersionDownload SizeInstall Size
HackerNews (iOS)
com.emergetools.hackernews
Release3.8 (1)6.5 MB (N/A)9.7 MB (N/A)

Android Builds

NameConfigurationVersionDownload SizeUncompressed Size
Hacker News (Android)
com.emergetools.hackernews
Release1.0.2 (13)Processing... (-)Processing... (-)

Configure launchpad-test-ios status check rules

@sentry

sentryBot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

📲 Install Builds

iOS

🔗 App NameApp IDVersionConfiguration
HackerNewscom.emergetools.hackernews3.8 (1)Release

Android

🔗 App NameApp IDVersionConfiguration
Hacker Newscom.emergetools.hackernews1.0.2 (13)Release

⚙️ launchpad-test-android Build Distribution Settings

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 2 potential issues.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 59bf93e. Configure here.

if "::" not in qualified_name:
return CppNamespaceFunction(namespace="(global)", function_name=qualified_name)
namespace, function_name = qualified_name.rsplit("::", 1)
return CppNamespaceFunction(namespace=namespace, function_name=function_name)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Demangled C++ names split incorrectly

Medium Severity

Ownership is taken from demangled text by cutting at the first ( and the last ::. That breaks operator(), template arguments that contain ::, and demanglings that include a return type, so C++ groups and inferred ELF class owners land on the wrong names.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 59bf93e. Configure here.

if "::" not in qualified_name:
return CppNamespaceFunction(namespace="(global)", function_name=qualified_name)
namespace, function_name = qualified_name.rsplit("::", 1)
return CppNamespaceFunction(namespace=namespace, function_name=function_name)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Apple analysis version not bumped

Medium Severity

C++ symbol grouping for Apple binaries now comes from demangled names instead of mangled nested-name components, which changes namespaces and function buckets. APPLE_ANALYSIS_VERSION stays at 1.2.1, so consumers still treat the new treemap layout as comparable to older reports.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 59bf93e. Configure here.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@trevor-e
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat(size): add standalone ELF analysis by trevor-e · Pull Request #659 · getsentry/launchpad · GitHub
Skip to content

feat(size): add standalone ELF analysis - #659

Draft
trevor-e wants to merge 1 commit into
mainfrom
telkins/elf-size-analysis
Draft

feat(size): add standalone ELF analysis#659
trevor-e wants to merge 1 commit into
mainfrom
telkins/elf-size-analysis

Conversation

@trevor-e

Copy link
Copy Markdown
Member

Summary

  • auto-detect standalone ELF executables and shared libraries through the existing launchpad size command
  • parse ELF sections and symbols with LIEF, use DWARF for verified C++ class ownership, and fall back to inferred demangled scopes
  • account for file-backed bytes without double counting aliases or overlapping symbols
  • support optional separate debug files through build IDs and .gnu_debuglink
  • emit a dedicated ELF result model and class-level treemap while keeping the app artifact worker limited to Apple and Android inputs

Dependencies

  • add pyelftools==0.33 for DWARF parsing; it is pure Python, has no transitive dependencies, and declares a public-domain license
  • use the platform __cxa_demangle ABI through ctypes instead of adding a demangler package

Test plan

  • .venv/bin/python -m ruff check src tests
  • .venv/bin/python -m ty check --error-on-warning src
  • focused ELF, Apple, Android, CLI, artifact factory, worker boundary, and C++ aggregation tests
  • launchpad size smoke test against the clean-room ELF fixture
  • standalone analysis smoke test against a real stripped ELF shared library

Known limitation

The committed clean-room DWARF fixture has an ET_DYN header but no program headers because it is generated with the macOS cross-compiler without a Linux ELF linker. The parser is also smoke-tested against a fully linked stripped shared library.

@sentry

sentryBot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Size Analysis

1 component analyzed, 1 component processing

iOS Builds

NameConfigurationVersionDownload SizeInstall Size
HackerNews (iOS)
com.emergetools.hackernews
Release3.8 (1)6.5 MB (N/A)9.7 MB (N/A)

Android Builds

NameConfigurationVersionDownload SizeUncompressed Size
Hacker News (Android)
com.emergetools.hackernews
Release1.0.2 (13)Processing... (-)Processing... (-)

Configure launchpad-test-ios status check rules

@sentry

sentryBot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

📲 Install Builds

iOS

🔗 App NameApp IDVersionConfiguration
HackerNewscom.emergetools.hackernews3.8 (1)Release

Android

🔗 App NameApp IDVersionConfiguration
Hacker Newscom.emergetools.hackernews1.0.2 (13)Release

⚙️ launchpad-test-android Build Distribution Settings

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 2 potential issues.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 59bf93e. Configure here.

if "::" not in qualified_name:
return CppNamespaceFunction(namespace="(global)", function_name=qualified_name)
namespace, function_name = qualified_name.rsplit("::", 1)
return CppNamespaceFunction(namespace=namespace, function_name=function_name)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Demangled C++ names split incorrectly

Medium Severity

Ownership is taken from demangled text by cutting at the first ( and the last ::. That breaks operator(), template arguments that contain ::, and demanglings that include a return type, so C++ groups and inferred ELF class owners land on the wrong names.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 59bf93e. Configure here.

if "::" not in qualified_name:
return CppNamespaceFunction(namespace="(global)", function_name=qualified_name)
namespace, function_name = qualified_name.rsplit("::", 1)
return CppNamespaceFunction(namespace=namespace, function_name=function_name)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Apple analysis version not bumped

Medium Severity

C++ symbol grouping for Apple binaries now comes from demangled names instead of mangled nested-name components, which changes namespaces and function buckets. APPLE_ANALYSIS_VERSION stays at 1.2.1, so consumers still treat the new treemap layout as comparable to older reports.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 59bf93e. Configure here.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@trevor-e
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat(size): add standalone ELF analysis by trevor-e · Pull Request #659 · getsentry/launchpad · GitHub
Skip to content

feat(size): add standalone ELF analysis - #659

Draft
trevor-e wants to merge 1 commit into
mainfrom
telkins/elf-size-analysis
Draft

feat(size): add standalone ELF analysis#659
trevor-e wants to merge 1 commit into
mainfrom
telkins/elf-size-analysis

Conversation

@trevor-e

Copy link
Copy Markdown
Member

Summary

  • auto-detect standalone ELF executables and shared libraries through the existing launchpad size command
  • parse ELF sections and symbols with LIEF, use DWARF for verified C++ class ownership, and fall back to inferred demangled scopes
  • account for file-backed bytes without double counting aliases or overlapping symbols
  • support optional separate debug files through build IDs and .gnu_debuglink
  • emit a dedicated ELF result model and class-level treemap while keeping the app artifact worker limited to Apple and Android inputs

Dependencies

  • add pyelftools==0.33 for DWARF parsing; it is pure Python, has no transitive dependencies, and declares a public-domain license
  • use the platform __cxa_demangle ABI through ctypes instead of adding a demangler package

Test plan

  • .venv/bin/python -m ruff check src tests
  • .venv/bin/python -m ty check --error-on-warning src
  • focused ELF, Apple, Android, CLI, artifact factory, worker boundary, and C++ aggregation tests
  • launchpad size smoke test against the clean-room ELF fixture
  • standalone analysis smoke test against a real stripped ELF shared library

Known limitation

The committed clean-room DWARF fixture has an ET_DYN header but no program headers because it is generated with the macOS cross-compiler without a Linux ELF linker. The parser is also smoke-tested against a fully linked stripped shared library.

@sentry

sentryBot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Size Analysis

1 component analyzed, 1 component processing

iOS Builds

NameConfigurationVersionDownload SizeInstall Size
HackerNews (iOS)
com.emergetools.hackernews
Release3.8 (1)6.5 MB (N/A)9.7 MB (N/A)

Android Builds

NameConfigurationVersionDownload SizeUncompressed Size
Hacker News (Android)
com.emergetools.hackernews
Release1.0.2 (13)Processing... (-)Processing... (-)

Configure launchpad-test-ios status check rules

@sentry

sentryBot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

📲 Install Builds

iOS

🔗 App NameApp IDVersionConfiguration
HackerNewscom.emergetools.hackernews3.8 (1)Release

Android

🔗 App NameApp IDVersionConfiguration
Hacker Newscom.emergetools.hackernews1.0.2 (13)Release

⚙️ launchpad-test-android Build Distribution Settings

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 2 potential issues.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 59bf93e. Configure here.

if "::" not in qualified_name:
return CppNamespaceFunction(namespace="(global)", function_name=qualified_name)
namespace, function_name = qualified_name.rsplit("::", 1)
return CppNamespaceFunction(namespace=namespace, function_name=function_name)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Demangled C++ names split incorrectly

Medium Severity

Ownership is taken from demangled text by cutting at the first ( and the last ::. That breaks operator(), template arguments that contain ::, and demanglings that include a return type, so C++ groups and inferred ELF class owners land on the wrong names.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 59bf93e. Configure here.

if "::" not in qualified_name:
return CppNamespaceFunction(namespace="(global)", function_name=qualified_name)
namespace, function_name = qualified_name.rsplit("::", 1)
return CppNamespaceFunction(namespace=namespace, function_name=function_name)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Apple analysis version not bumped

Medium Severity

C++ symbol grouping for Apple binaries now comes from demangled names instead of mangled nested-name components, which changes namespaces and function buckets. APPLE_ANALYSIS_VERSION stays at 1.2.1, so consumers still treat the new treemap layout as comparable to older reports.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 59bf93e. Configure here.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@trevor-e
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' feat(size): add standalone ELF analysis by trevor-e · Pull Request #659 · getsentry/launchpad · GitHub
Skip to content

feat(size): add standalone ELF analysis - #659

Draft
trevor-e wants to merge 1 commit into
mainfrom
telkins/elf-size-analysis
Draft

feat(size): add standalone ELF analysis#659
trevor-e wants to merge 1 commit into
mainfrom
telkins/elf-size-analysis

Conversation

@trevor-e

Copy link
Copy Markdown
Member

Summary

  • auto-detect standalone ELF executables and shared libraries through the existing launchpad size command
  • parse ELF sections and symbols with LIEF, use DWARF for verified C++ class ownership, and fall back to inferred demangled scopes
  • account for file-backed bytes without double counting aliases or overlapping symbols
  • support optional separate debug files through build IDs and .gnu_debuglink
  • emit a dedicated ELF result model and class-level treemap while keeping the app artifact worker limited to Apple and Android inputs

Dependencies

  • add pyelftools==0.33 for DWARF parsing; it is pure Python, has no transitive dependencies, and declares a public-domain license
  • use the platform __cxa_demangle ABI through ctypes instead of adding a demangler package

Test plan

  • .venv/bin/python -m ruff check src tests
  • .venv/bin/python -m ty check --error-on-warning src
  • focused ELF, Apple, Android, CLI, artifact factory, worker boundary, and C++ aggregation tests
  • launchpad size smoke test against the clean-room ELF fixture
  • standalone analysis smoke test against a real stripped ELF shared library

Known limitation

The committed clean-room DWARF fixture has an ET_DYN header but no program headers because it is generated with the macOS cross-compiler without a Linux ELF linker. The parser is also smoke-tested against a fully linked stripped shared library.

@sentry

sentryBot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Size Analysis

1 component analyzed, 1 component processing

iOS Builds

NameConfigurationVersionDownload SizeInstall Size
HackerNews (iOS)
com.emergetools.hackernews
Release3.8 (1)6.5 MB (N/A)9.7 MB (N/A)

Android Builds

NameConfigurationVersionDownload SizeUncompressed Size
Hacker News (Android)
com.emergetools.hackernews
Release1.0.2 (13)Processing... (-)Processing... (-)

Configure launchpad-test-ios status check rules

@sentry

sentryBot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

📲 Install Builds

iOS

🔗 App NameApp IDVersionConfiguration
HackerNewscom.emergetools.hackernews3.8 (1)Release

Android

🔗 App NameApp IDVersionConfiguration
Hacker Newscom.emergetools.hackernews1.0.2 (13)Release

⚙️ launchpad-test-android Build Distribution Settings

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 2 potential issues.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 59bf93e. Configure here.

if "::" not in qualified_name:
return CppNamespaceFunction(namespace="(global)", function_name=qualified_name)
namespace, function_name = qualified_name.rsplit("::", 1)
return CppNamespaceFunction(namespace=namespace, function_name=function_name)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Demangled C++ names split incorrectly

Medium Severity

Ownership is taken from demangled text by cutting at the first ( and the last ::. That breaks operator(), template arguments that contain ::, and demanglings that include a return type, so C++ groups and inferred ELF class owners land on the wrong names.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 59bf93e. Configure here.

if "::" not in qualified_name:
return CppNamespaceFunction(namespace="(global)", function_name=qualified_name)
namespace, function_name = qualified_name.rsplit("::", 1)
return CppNamespaceFunction(namespace=namespace, function_name=function_name)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Apple analysis version not bumped

Medium Severity

C++ symbol grouping for Apple binaries now comes from demangled names instead of mangled nested-name components, which changes namespaces and function buckets. APPLE_ANALYSIS_VERSION stays at 1.2.1, so consumers still treat the new treemap layout as comparable to older reports.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 59bf93e. Configure here.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@trevor-e
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat(size): add standalone ELF analysis by trevor-e · Pull Request #659 · getsentry/launchpad · GitHub
Skip to content

feat(size): add standalone ELF analysis - #659

Draft
trevor-e wants to merge 1 commit into
mainfrom
telkins/elf-size-analysis
Draft

feat(size): add standalone ELF analysis#659
trevor-e wants to merge 1 commit into
mainfrom
telkins/elf-size-analysis

Conversation

@trevor-e

Copy link
Copy Markdown
Member

Summary

  • auto-detect standalone ELF executables and shared libraries through the existing launchpad size command
  • parse ELF sections and symbols with LIEF, use DWARF for verified C++ class ownership, and fall back to inferred demangled scopes
  • account for file-backed bytes without double counting aliases or overlapping symbols
  • support optional separate debug files through build IDs and .gnu_debuglink
  • emit a dedicated ELF result model and class-level treemap while keeping the app artifact worker limited to Apple and Android inputs

Dependencies

  • add pyelftools==0.33 for DWARF parsing; it is pure Python, has no transitive dependencies, and declares a public-domain license
  • use the platform __cxa_demangle ABI through ctypes instead of adding a demangler package

Test plan

  • .venv/bin/python -m ruff check src tests
  • .venv/bin/python -m ty check --error-on-warning src
  • focused ELF, Apple, Android, CLI, artifact factory, worker boundary, and C++ aggregation tests
  • launchpad size smoke test against the clean-room ELF fixture
  • standalone analysis smoke test against a real stripped ELF shared library

Known limitation

The committed clean-room DWARF fixture has an ET_DYN header but no program headers because it is generated with the macOS cross-compiler without a Linux ELF linker. The parser is also smoke-tested against a fully linked stripped shared library.

@sentry

sentryBot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Size Analysis

1 component analyzed, 1 component processing

iOS Builds

NameConfigurationVersionDownload SizeInstall Size
HackerNews (iOS)
com.emergetools.hackernews
Release3.8 (1)6.5 MB (N/A)9.7 MB (N/A)

Android Builds

NameConfigurationVersionDownload SizeUncompressed Size
Hacker News (Android)
com.emergetools.hackernews
Release1.0.2 (13)Processing... (-)Processing... (-)

Configure launchpad-test-ios status check rules

@sentry

sentryBot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

📲 Install Builds

iOS

🔗 App NameApp IDVersionConfiguration
HackerNewscom.emergetools.hackernews3.8 (1)Release

Android

🔗 App NameApp IDVersionConfiguration
Hacker Newscom.emergetools.hackernews1.0.2 (13)Release

⚙️ launchpad-test-android Build Distribution Settings

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 2 potential issues.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 59bf93e. Configure here.

if "::" not in qualified_name:
return CppNamespaceFunction(namespace="(global)", function_name=qualified_name)
namespace, function_name = qualified_name.rsplit("::", 1)
return CppNamespaceFunction(namespace=namespace, function_name=function_name)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Demangled C++ names split incorrectly

Medium Severity

Ownership is taken from demangled text by cutting at the first ( and the last ::. That breaks operator(), template arguments that contain ::, and demanglings that include a return type, so C++ groups and inferred ELF class owners land on the wrong names.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 59bf93e. Configure here.

if "::" not in qualified_name:
return CppNamespaceFunction(namespace="(global)", function_name=qualified_name)
namespace, function_name = qualified_name.rsplit("::", 1)
return CppNamespaceFunction(namespace=namespace, function_name=function_name)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Apple analysis version not bumped

Medium Severity

C++ symbol grouping for Apple binaries now comes from demangled names instead of mangled nested-name components, which changes namespaces and function buckets. APPLE_ANALYSIS_VERSION stays at 1.2.1, so consumers still treat the new treemap layout as comparable to older reports.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 59bf93e. Configure here.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@trevor-e
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat(size): add standalone ELF analysis by trevor-e · Pull Request #659 · getsentry/launchpad · GitHub
Skip to content

feat(size): add standalone ELF analysis - #659

Draft
trevor-e wants to merge 1 commit into
mainfrom
telkins/elf-size-analysis
Draft

feat(size): add standalone ELF analysis#659
trevor-e wants to merge 1 commit into
mainfrom
telkins/elf-size-analysis

Conversation

@trevor-e

Copy link
Copy Markdown
Member

Summary

  • auto-detect standalone ELF executables and shared libraries through the existing launchpad size command
  • parse ELF sections and symbols with LIEF, use DWARF for verified C++ class ownership, and fall back to inferred demangled scopes
  • account for file-backed bytes without double counting aliases or overlapping symbols
  • support optional separate debug files through build IDs and .gnu_debuglink
  • emit a dedicated ELF result model and class-level treemap while keeping the app artifact worker limited to Apple and Android inputs

Dependencies

  • add pyelftools==0.33 for DWARF parsing; it is pure Python, has no transitive dependencies, and declares a public-domain license
  • use the platform __cxa_demangle ABI through ctypes instead of adding a demangler package

Test plan

  • .venv/bin/python -m ruff check src tests
  • .venv/bin/python -m ty check --error-on-warning src
  • focused ELF, Apple, Android, CLI, artifact factory, worker boundary, and C++ aggregation tests
  • launchpad size smoke test against the clean-room ELF fixture
  • standalone analysis smoke test against a real stripped ELF shared library

Known limitation

The committed clean-room DWARF fixture has an ET_DYN header but no program headers because it is generated with the macOS cross-compiler without a Linux ELF linker. The parser is also smoke-tested against a fully linked stripped shared library.

@sentry

sentryBot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Size Analysis

1 component analyzed, 1 component processing

iOS Builds

NameConfigurationVersionDownload SizeInstall Size
HackerNews (iOS)
com.emergetools.hackernews
Release3.8 (1)6.5 MB (N/A)9.7 MB (N/A)

Android Builds

NameConfigurationVersionDownload SizeUncompressed Size
Hacker News (Android)
com.emergetools.hackernews
Release1.0.2 (13)Processing... (-)Processing... (-)

Configure launchpad-test-ios status check rules

@sentry

sentryBot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

📲 Install Builds

iOS

🔗 App NameApp IDVersionConfiguration
HackerNewscom.emergetools.hackernews3.8 (1)Release

Android

🔗 App NameApp IDVersionConfiguration
Hacker Newscom.emergetools.hackernews1.0.2 (13)Release

⚙️ launchpad-test-android Build Distribution Settings

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 2 potential issues.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 59bf93e. Configure here.

if "::" not in qualified_name:
return CppNamespaceFunction(namespace="(global)", function_name=qualified_name)
namespace, function_name = qualified_name.rsplit("::", 1)
return CppNamespaceFunction(namespace=namespace, function_name=function_name)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Demangled C++ names split incorrectly

Medium Severity

Ownership is taken from demangled text by cutting at the first ( and the last ::. That breaks operator(), template arguments that contain ::, and demanglings that include a return type, so C++ groups and inferred ELF class owners land on the wrong names.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 59bf93e. Configure here.

if "::" not in qualified_name:
return CppNamespaceFunction(namespace="(global)", function_name=qualified_name)
namespace, function_name = qualified_name.rsplit("::", 1)
return CppNamespaceFunction(namespace=namespace, function_name=function_name)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Apple analysis version not bumped

Medium Severity

C++ symbol grouping for Apple binaries now comes from demangled names instead of mangled nested-name components, which changes namespaces and function buckets. APPLE_ANALYSIS_VERSION stays at 1.2.1, so consumers still treat the new treemap layout as comparable to older reports.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 59bf93e. Configure here.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@trevor-e
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); feat(size): add standalone ELF analysis by trevor-e · Pull Request #659 · getsentry/launchpad · GitHub
Skip to content

feat(size): add standalone ELF analysis - #659

Draft
trevor-e wants to merge 1 commit into
mainfrom
telkins/elf-size-analysis
Draft

feat(size): add standalone ELF analysis#659
trevor-e wants to merge 1 commit into
mainfrom
telkins/elf-size-analysis

Conversation

@trevor-e

Copy link
Copy Markdown
Member

Summary

  • auto-detect standalone ELF executables and shared libraries through the existing launchpad size command
  • parse ELF sections and symbols with LIEF, use DWARF for verified C++ class ownership, and fall back to inferred demangled scopes
  • account for file-backed bytes without double counting aliases or overlapping symbols
  • support optional separate debug files through build IDs and .gnu_debuglink
  • emit a dedicated ELF result model and class-level treemap while keeping the app artifact worker limited to Apple and Android inputs

Dependencies

  • add pyelftools==0.33 for DWARF parsing; it is pure Python, has no transitive dependencies, and declares a public-domain license
  • use the platform __cxa_demangle ABI through ctypes instead of adding a demangler package

Test plan

  • .venv/bin/python -m ruff check src tests
  • .venv/bin/python -m ty check --error-on-warning src
  • focused ELF, Apple, Android, CLI, artifact factory, worker boundary, and C++ aggregation tests
  • launchpad size smoke test against the clean-room ELF fixture
  • standalone analysis smoke test against a real stripped ELF shared library

Known limitation

The committed clean-room DWARF fixture has an ET_DYN header but no program headers because it is generated with the macOS cross-compiler without a Linux ELF linker. The parser is also smoke-tested against a fully linked stripped shared library.

@sentry

sentryBot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Size Analysis

1 component analyzed, 1 component processing

iOS Builds

NameConfigurationVersionDownload SizeInstall Size
HackerNews (iOS)
com.emergetools.hackernews
Release3.8 (1)6.5 MB (N/A)9.7 MB (N/A)

Android Builds

NameConfigurationVersionDownload SizeUncompressed Size
Hacker News (Android)
com.emergetools.hackernews
Release1.0.2 (13)Processing... (-)Processing... (-)

Configure launchpad-test-ios status check rules

@sentry

sentryBot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

📲 Install Builds

iOS

🔗 App NameApp IDVersionConfiguration
HackerNewscom.emergetools.hackernews3.8 (1)Release

Android

🔗 App NameApp IDVersionConfiguration
Hacker Newscom.emergetools.hackernews1.0.2 (13)Release

⚙️ launchpad-test-android Build Distribution Settings

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 2 potential issues.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 59bf93e. Configure here.

if "::" not in qualified_name:
return CppNamespaceFunction(namespace="(global)", function_name=qualified_name)
namespace, function_name = qualified_name.rsplit("::", 1)
return CppNamespaceFunction(namespace=namespace, function_name=function_name)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Demangled C++ names split incorrectly

Medium Severity

Ownership is taken from demangled text by cutting at the first ( and the last ::. That breaks operator(), template arguments that contain ::, and demanglings that include a return type, so C++ groups and inferred ELF class owners land on the wrong names.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 59bf93e. Configure here.

if "::" not in qualified_name:
return CppNamespaceFunction(namespace="(global)", function_name=qualified_name)
namespace, function_name = qualified_name.rsplit("::", 1)
return CppNamespaceFunction(namespace=namespace, function_name=function_name)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Apple analysis version not bumped

Medium Severity

C++ symbol grouping for Apple binaries now comes from demangled names instead of mangled nested-name components, which changes namespaces and function buckets. APPLE_ANALYSIS_VERSION stays at 1.2.1, so consumers still treat the new treemap layout as comparable to older reports.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 59bf93e. Configure here.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@trevor-e