[webkit-dev] Possible issue with TCMalloc_PageHeap on Solaris 10 (amd64) ?

Xavier Roche roche+webkit at exalead.com
Tue May 25 07:38:44 PDT 2010


Hi folks!,

[ Please redirect me if the question is off-topic here ]

I am trying to build webkit (qt flavour, current 4.6.1 stable release) on 
Solaris, and I am facing weird SEGV issues when trying to use objects such 
as QWebPage. The underlying issue seems to be related to the TCMalloc* 
layer.
Might be related to threading issues, too. This does not look like a 
qt-centric issue, as far as I can see ; but this might be related to a 
really trivial build option not set correctly - do not hesitate to give 
feedback if you have a running build on Solaris.

Does anybody is experiencing the same issue on Solaris ?

The libraries have been built on Solaris 10, amd64 (64-bit), using the 
official qt-everywhere-opensource-src-4.6.1.tar.gz package, with two minor 
patches (see [1] and [2])

Various gcc releases have been tested for the qt/webkit build with the 
same effect (3.4.3, 3.4.6, 4.1.2) ; in release and debug more (-release or 
-debug)

The libraries have been built using:
./configure -shared -opensource -debug -no-separate-debug-info -webkit 
-xmlpatterns -fontconfig -qt-gif -qt-libjpeg -qt-libpng -qt-libtiff 
-qt-libmng -no-accessibility -no-sql-sqlite -no-phonon -no-phonon-backend 
-no-audio-backend -no-multimedia -no-opengl -no-qt3support -no-declarative 
-no-dbus -platform solaris-g++-64 -prefix /data/qt/qt4-install -D 
ALWAYS_INLINE=inline

Note: -DALWAYS_INLINE=inline added as workaround for a build oddity (see 
[3]) when using -debug

I first tested various demos, including the demo/browser one (see [4]), 
and I managed to have a minimal test case:

The sample application itself is really simple:

#include <QtGui/QApplication>
#include <QtWebKit/QtWebKit>

int main(int argc, char **argv) {
   QApplication *app = new QApplication(argc, argv, 
QApplication::GuiClient);
   QWebPage *fakePage = new QWebPage();
   fakePage->action(QWebPage::Stop);
   (void) app;
   fprintf(stderr, "successfully started\n");
   QApplication::instance()->exec(); 
}

This trivial program works fine on Linux, but produces a SEGV on Solaris 
on the "QWebPage *fakePage = new QWebPage()" line:

(l at 1) signal SEGV (no mapping at the fault address) at 0xfffffd7ffd68a9d7 
at 0xfffffd7ffd68a9d7
0xfffffd7ffd68a9d7:     decl     %edx
Entering debugger ...

the dbx trace shows: (sorry for the meaningless stack frame - I am trying 
to get a more decent version of dbx, because the verbose library release 
of libQtWebKit.so is too verbose for dbx - *sigh*)

Current function is main
    16     QWebPage *fakePage = new QWebPage();
(dbx) where
   [1] WTF::TCMalloc_PageHeap::GrowHeap(0xfffffd7ffea5a47c, 0x0, 
0xfffffd7ffa52f, 0x0, 0x0, 0x0), at 0xfffffd7ffd68a9d7
   [2] WTF::TCMalloc_Central_FreeList::FetchFromSpansSafe(0x0, 0x0, 0x0, 
0x0, 0x0, 0x0), at 0xfffffd7ffd68b1b1
   [3] WTF::TCMalloc_Central_FreeList::RemoveRange(0x0, 0x0, 0x0, 0x0, 0x0, 
0x0), at 0xfffffd7ffd68b58b
   [4] WTF::fastMalloc(0x0, 0x0, 0x0, 0x0, 0x0, 0x0), at 0xfffffd7ffd68c540
   [5] WTF::initializeThreading(0x0, 0x0, 0x0, 0x0, 0x0, 0x0), at 
0xfffffd7ffd690c0e
   [6] JSC::initializeThreading(0x0, 0x0, 0x0, 0x0, 0x0, 0x0), at 
0xfffffd7ffd53f965
   [7] QWebPagePrivate::QWebPagePrivate(0x0, 0x0, 0x0, 0x0, 0x0, 0x0), at 
0xfffffd7ffdf0abf6
   [8] QWebPage::QWebPage(0x0, 0x0, 0x0, 0x0, 0x0, 0x0), at 
0xfffffd7ffdf112c5
=>[9] main(argc = 1, argv = 0xfffffd7fffdfd3a8), line 16 in "test-gui.cpp"


Any hint or suggestion would be appreciated :)



[1]
--- src/3rdparty/webkit/JavaScriptCore/wtf/StringExtras.h
+++ src/3rdparty/webkit/JavaScriptCore/wtf/StringExtras.h
@@ -85,7 +85,7 @@

  #endif

-#if PLATFORM(WIN_OS) || PLATFORM(LINUX)
+#if PLATFORM(WIN_OS) || PLATFORM(LINUX) || PLATFORM(SOLARIS)

  inline char* strnstr(const char* buffer, const char* target, size_t 
bufferLength)
  {
--- src/3rdparty/javascriptcore/JavaScriptCore/wtf/StringExtras.h
+++ src/3rdparty/javascriptcore/JavaScriptCore/wtf/StringExtras.h
@@ -85,7 +85,7 @@

  #endif

-#if PLATFORM(WIN_OS) || PLATFORM(LINUX)
+#if PLATFORM(WIN_OS) || PLATFORM(LINUX) || PLATFORM(SOLARIS)

  inline char* strnstr(const char* buffer, const char* target, size_t 
bufferLength)
  {

[2] workaround for sun ld : remove the '-Wl,--gc-sections' option in 
src/3rdparty/webkit/WebCore/Makefile ; also replaced configure to use 
bash:
for i in $(find . -type f -name configure) ; do gsed -ie 
's%^#!/bin/sh%#!/bin/bash%' "$i"; done


[3]
../JavaScriptCore/wtf/PassRefPtr.h: In static member function `static 
WTF::PassRefPtr<WTF::ByteArray> WTF::ByteArray::create(size_t)':
../JavaScriptCore/wtf/PassRefPtr.h:66: sorry, unimplemented: inlining 
failed in call to 'WTF::PassRefPtr<T>::~PassRefPtr() [with T = 
WTF::ByteArray]': function body not available
../JavaScriptCore/wtf/ByteArray.cpp:35: sorry, unimplemented: called from 
here

[4]
(dbx) where -l
current thread: t at 1
   [1] 
libQtWebKit.so.4.6.1:WTF::TCMalloc_PageHeap::GrowHeap(0xfffffd7fff05a47c, 
0x0, 0xfffffd7ff9faf, 0x0, 0x0, 0x0), at 0xfffffd7ffdc8a9d7
   [2] 
libQtWebKit.so.4.6.1:WTF::TCMalloc_Central_FreeList::FetchFromSpansSafe(0x0, 
0x0, 0x0, 0x0, 0x0, 0x0), at 0xfffffd7ffdc8b1b1
   [3] 
libQtWebKit.so.4.6.1:WTF::TCMalloc_Central_FreeList::RemoveRange(0x0, 0x0, 
0x0, 0x0, 0x0, 0x0), at 0xfffffd7ffdc8b58b
   [4] libQtWebKit.so.4.6.1:WTF::fastMalloc(0x0, 0x0, 0x0, 0x0, 0x0, 0x0), 
at 0xfffffd7ffdc8c540
   [5] libQtWebKit.so.4.6.1:WebCore::atomicCanonicalTextEncodingName(0x0, 
0x0, 0x0, 0x0, 0x0, 0x0), at 0xfffffd7ffe36f41a
   [6] libQtWebKit.so.4.6.1:WebCore::TextEncoding::TextEncoding(0x0, 0x0, 
0x0, 0x0, 0x0, 0x0), at 0xfffffd7ffe36c874
   [7] libQtWebKit.so.4.6.1:WebCore::UTF8Encoding(0x0, 0x0, 0x0, 0x0, 0x0, 
0x0), at 0xfffffd7ffe36cbb9
   [8] libQtWebKit.so.4.6.1:WebCore::KURL::KURL(0x0, 0x0, 0x0, 0x0, 0x0, 
0x0), at 0xfffffd7ffe4d66c1
   [9] libQtWebKit.so.4.6.1:QWebSettings::iconForUrl(0x0, 0x0, 0x0, 0x0, 
0x0, 0x0), at 0xfffffd7ffe521ad5
=>[10] browser:BrowserApplication::icon(this = 0xfffffd7fffdff7c0, url = 
CLASS), line 452 in "browserapplication.cpp"
   [11] browser:UrlLineEdit::webViewIconChanged(this = 0x8b4910), line 292 
in "urllineedit.cpp"
   [12] browser:UrlLineEdit::UrlLineEdit(this = 0x8b4910, parent = (nil)), 
line 265 in "urllineedit.cpp"
   [13] browser:TabWidget::newTab(this = 0x757110, makeCurrent = true), 
line 412 in "tabwidget.cpp"
   [14] browser:BrowserMainWindow::BrowserMainWindow(this = 0x64e4f0, 
parent = (nil), flags = CLASS), line 146 in "browsermainwindow.cpp"
   [15] browser:BrowserApplication::newMainWindow(this = 
0xfffffd7fffdff7c0), line 372 in "browserapplication.cpp"
   [16] browser:main(argc = 1, argv = 0xfffffd7fffdff838), line 50 in 
"main.cpp"



More information about the webkit-dev mailing list