Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP

Loading…

Crashes with TTF fonts on OS X #44

Closed
arandaio opened this Issue · 74 comments
@arandaio

https://gist.github.com/2405155

I have a simple feature (see Gist) and when I run the test I get the error randomly (some times in one Scenario and other in another) . In the Gist example, if I run the failing test again, the tes pass correctly.

uname -a => Linux jarandapc 3.0.6-gentoo #2 SMP PREEMPT Wed Nov 9 21:42:08 CET 2011 x86_64 Intel(R) Pentium(R) CPU G860 @ 3.00GHz GenuineIntel GNU/Linux

Any idea?

@jonleighton
Owner

Hmm, it sounds like phantomjs is segfaulting. Did you compile phantomjs yourself or install the binary? If you installed the binary, try compiling it yourself?

Ultimately probably there are going to be issues like this from time to time, so I should add some easy way to run phantomjs under gdb so that people can obtain stack traces and we can find/fix the issues.

@sarmiena

I'm getting this error on a regular basis:

     Capybara::Poltergeist::DeadClient:
       The PhantomJS client died while processing {"name":"visit","args":["http://test.host:1337/plans"]}

capybara 1.1.2
poltergeist 0.6.0
phantomjs 1.5.0 (binary -- downloaded from site and all files inserted into rails application /spec/support/)
OSX Lion

# spec_helper.rb
  Capybara.register_driver :poltergeist do |app|
    if RUBY_PLATFORM.downcase.include?("darwin")
      Capybara::Poltergeist::Driver.new(app, phantomjs: "#{Rails::root}/spec/support/darwin/phantomjs/bin/phantomjs")
    elsif RUBY_PLATFORM.downcase.include?("linux")
      Capybara::Poltergeist::Driver.new(app, phantomjs: "#{Rails::root}/spec/support/linux/phantomjs/bin/phantomjs")
    end
  end

Console errors:
4/20/12 11:32:42.672 PM ReportCrash: Failed to create CSSymbolicatorRef for phantomjs[18040]
4/20/12 11:32:42.780 PM ReportCrash: Failed to create dSYM-less CSSymbolicatorRef for phantomjs[18040]

@jonleighton
Owner

@sarmiena does your crash happen every time on the same tests, or does it sometimes happen and sometimes not? does it happen on all tests or just some of them?

@sarmiena

It happens on every other test (first one passes).

@DouweM

I'm having the exact same problem:

Failure/Error: click_button "Log in"
Capybara::Poltergeist::DeadClient:
  The PhantomJS client died while processing {"name":"click","args":[4,2]}

with this extremely exciting code:

visit new_user_session_path
fill_in "Email",    with: current_user.email
fill_in "Password", with: current_user.password
click_button "Log in"

As with @sarmiena, it happens with every other test, so I'm seeing ".F.F", after which it halts until I ^C.

@sarmiena

Any epiphanies?

@DouweM

None on my part, I've started using capybara-webkit again.

@sarmiena

same here

@jonleighton
Owner

Hi guys,

Sorry you've had trouble. I've posted a message on the PhantomJS list here: http://groups.google.com/group/phantomjs/browse_thread/thread/2365cfca349018f8

Let's see if anyone has ideas on there - I don't know much about OS X issues but others on that list do.

Jon

@sarmiena

cool. thanks

@jonleighton
Owner

Hi guys,

Can those of you who are experiencing crashes try running ulimit -c unlimited before running your tests? This will allow your OS to generate a core file when it crashes. Which you can then send to me. On OS X the core file will be in /cores. On Linux it'll be in the current working directory.

Thanks

Update: please don't do this on OS X. I won't be able to analyse it. The next version of PhantomJS will include crash reporting capability which will help.

@senny

I switchted to poltergeist some time ago and everything runs fine. This morning I did some gem upgrades and I noticed features tagged running with poltergeist started failing. I don't have much time to debug the issue but I would like to share the information I've got. I tracked the DeadClinet error down to the following commit:

diff --git a/Gemfile b/Gemfile
index 42b5a60..6895444 100644
--- a/Gemfile
+++ b/Gemfile
@@ -69,7 +69,7 @@ end
 # Gems used only for assets and not required
 # in production environments by default.
 group :assets do
-  gem 'twitter-bootstrap-rails', :git => 'https://github.com/seyhunak/twitter-bootstrap-rails.git' # bootst
+  gem 'twitter-bootstrap-rails', '~> 2.1.0'
   gem 'therubyracer'
   gem 'uglifier', '>= 1.0.3'
 end
diff --git a/Gemfile.lock b/Gemfile.lock
index e609e85..9a0ee2c 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -12,16 +12,6 @@ GIT
       capybara

 GIT
-  remote: https://github.com/seyhunak/twitter-bootstrap-rails.git
-  revision: c646c2d31174f4d3b3bd01c715ea4a3e5587c85d
-  specs:
-    twitter-bootstrap-rails (2.0.8.1)
-      actionpack (>= 3.1)
-      less-rails (~> 2.2.2)
-      railties (>= 3.1)
-      therubyracer (~> 0.10.1)
-
-GIT
   remote: ssh://code@git.garaio.com:29418/ror/garaio/garaio_view_helpers
   revision: 75327969674d6a6d7ae556b6b4b61a3eacea1fdb
   branch: master
@@ -307,6 +297,11 @@ GEM
       polyglot
       polyglot (>= 0.3.1)
     ttfunk (1.0.3)
+    twitter-bootstrap-rails (2.1.0)
+      actionpack (>= 3.1)
+      less-rails (~> 2.2.2)
+      railties (>= 3.1)
+      therubyracer (~> 0.10.1)
     tzinfo (0.3.33)
     uglifier (1.2.3)
       execjs (>= 0.3.0)
@@ -352,7 +347,7 @@ DEPENDENCIES
   therubyracer
   thin
   timecop
-  twitter-bootstrap-rails!
+  twitter-bootstrap-rails (~> 2.1.0)
   uglifier (>= 1.0.3)
   virtus
   will_paginate

red works and green breaks features running with poltergeist randomly. I receive errors like:

The PhantomJS client died while processing {"name":"current_url","args":[]} (Capybara::Poltergeist::DeadClient)

I hope this helps somewhat. Feel free to ask if you need additional informations.

@walski

Running into the same problem over here but the only thing I share with the above mentioned gems is actionpack :/

@jonleighton
Owner

Just to let everyone in this ticket know, I have been working to add a crash reporter (google breakpad) to PhantomJS. This means that when the next release comes up we will have a good way of getting stack traces from crashes which should help a lot.

@senny

@jonleighton thanks for the update and your efforts. I hope we get more insight to resolve these random crashes.

@walski

:thumbsup:

I've managed to narrow the high level cause down a little bit in my case: I'm accessing a website with an iframe and the error happens when finally the iframe posts a message to the top window that leads to a change of the location of the top window. Interesting enough that does NOT happen when I try to "redirect" the top window to a not existing page but does happen when the page is delivered. It's a really simple page with just one h1 or whatever. Aaaalso I do see the crash when I return a 404 from my application server and the 404 is not delivered by the webserver itself. I've to investigate on the last finding a bit more, maybe there is some middleware doing strange things or whatever. Meh meh meh.

@Skulli

Just noticed the same issue on my project. It happens after i upgrade the above mentioned gem twitter-bootstrap-rails from 2.0.8 to 2.1.0 and 2.0.9. A Downgrade helped.
Though the problem only occurred on my mac with phantomjs installed via homebrew. My linux machine doesnt have that problem (binary install).

@DouweM

Upgrading from 2.0.8 tot 2.0.9 causes the problem you say? In that case the culprit in somewhere in this string of commits. Could you try pointing your Gemfile to each of those commits, to see at what point exactly the problem appears?

You can specify a commit to point to like this:

gem 'twitter-bootstrap-rails', :github => "seyhunak/twitter-bootstrap-rails", :ref => "a1b2c3"
@Skulli

Okay, tried it out and it starts happening with commit "fc40fde"
seyhunak/twitter-bootstrap-rails@fc40fde

@DouweM

This is so weird, because there's literally nothing in there that I could imagine having any effect on the way Poltergeist behaves; it's just a bunch of edited CSS files. Granted, I don't know anything about the internals of Poltergeist, so @jonleighton should really take a look at this, but I'm stumped.

@jonleighton
Owner

It's not really a poltergeist bug so much as a phantomjs/qt/webkit bug. Presumably that font is causing phantomjs to crash for some reason. The next version of phantomjs will be released this week - if somebody can produce a minimal test case for this crash that would be helpful and I will try to see if there is a fix possible in phantomjs.

@jonleighton
Owner

Actually, please ignore the above, as I see that you said it only happens on a Mac. I don't have easy access to a Mac so I won't be able to debug the crash in this short time frame.

However, my main priority at the moment is adding proper crash reporting to PhantomJS to help with these situations. Linux support is already done and I hope/intend to work on OS X support tomorrow in time for the 1.6.0 release. So it should get easier after that.

@mattgillooly

I encountered this error as well, and I was also able to resolve it by locking twitter-bootstrap-rails to version 2.0.8. Thanks @senny and @Skulli

@jonleighton
Owner

Can someone try out the master branching with PhantomJS 1.6 and let me know if you still have the problem with twitter bootstrap? Thanks

@Skulli

still crashing with the static 1.6 on mac os installed via brew.
Will upload the dmp file later.

@bcardarella

I had this issue the other day and was able to resolve it that one time by allowing ActiveRecord to work in multiple threads:

class ActiveRecord::Base
  mattr_accessor :shared_connection
  @@shared_connection = nil

  def self.connection
    @@shared_connection || retrieve_connection
  end
end

RSpec.configure do |config|
  config.before(:suite) do
    ActiveRecord::Base.shared_connection = ActiveRecord::Base.connection
  end
end

But now I am running into this issue again and am not able to diagnose it properly. I do not believe this is poltergeist specific as capybara-webkit just hangs with no timeout at all.

@bcardarella

It seems that TTF fonts are causing an issue here. The file cubano-regular-webfont.ttf, if we use other font formats we are OK.

@dynjo

We are getting this error too, using Font Awesome via https://github.com/wbzyl/less-rails-fontawesome

@harrikauhanen

Our tests also started passing (on Mac) when we disabled Font Awesome (https://github.com/littlebtc/font-awesome-sass-rails). Looks like a Mac+Font issue as it does not occur on Linux even with these font icons enabled.

@almog

Just like @bcardarella I just had this issue with ttf font files (svg and otf didn't cause any problem).

@bcardarella

It is strange because as long as the file is in the asset pipeline it errors out, even if the CSS does not reference the TTF file in anyway

@jonleighton
Owner

Here is a (not very useful) stack trace generated from that dump: https://gist.github.com/3257935

@mhenrixon mhenrixon referenced this issue in littlebtc/font-awesome-sass-rails
Open

Problem with ttf and Mac OS X #11

@ShogunPanda

In my case it happens only after the first example, then phantom get reinitialized and the next example goes through.
To be more understandable, the odds test go through, the evens fail.

@tombu tombu referenced this issue in seyhunak/twitter-bootstrap-rails
Closed

FontAwesome icons are not displayed in IE8 #361

@namxam

@ShogunPanda The reason why every second test works is due to the fact that poltergeist starts a new phantomjs browser after one dies.

@mjtko

I have created a monkey patch to prevent PhantomJS from crashing by denying access to TTF files in the assets pipeline when doing Rails integration tests.

It's unpleasant. It works until we get a fix to PhantomJS/Webkit. YMMV.

I needed this, as I both need the font-awesome-sass-rails gem in test and I use @font-face declarations within the application itself.

"Enjoy".

https://gist.github.com/3946516

@goosetav

instead of monkey patching to suppress TTF's from being served, you can use Rack::SimpleEndpoint from the rack-contrib gem to 403 any requests ending in .ttf in your test environment

https://gist.github.com/3996516

@samgranieri

@goosetav your hack worked. unfuckingbelievable.

@bcardarella

Very nice! Should this be pulled into Poltergeist or are we still treating this as a PhantomJS bug and waiting for a fix?

@mjtko

Don't think it should be pulled in as it works fine under Linux, just not under OSX. TBH, this is very much a Webkit/PhantomJS bug anyway. Might be worth adding to a FAQ though.

@mjtko

@goosetav Thanks for pointing out rack-contrib and that solution - I like that solution much better than monkey patching asset pipeline internals!

@mjtko

I've reworked @goosetav's approach a little -- I prefer 'complex' middleware configurations like this as an explicit initalizer rather than code inside an environment configuration file. I've also added explicit detection of PhantomJS on OS X, passing the request on to the rest of the middleware stack otherwise. Thanks again for the inspiration @goosetav. :+1:

https://gist.github.com/4003597

@goosetav

@mjtko thanks!

I'm not sure if this is fully PhantomJS's fault. I created a simple app to exploit the bug. I can reproduce it when using poltergeist via capybara+rspec but I cannot reproduce it using PhantomJS directly.

Of course, my test calls to PhantomJS are not 100% analogous to what's occurring when poltergeist / capybara is being used.

The bug is reproducible when visit is called a second time AND when that page contains a TrueType Font declaration. PhantomJS itself has no issue rendering the TrueType font - you can see this by hitting the page directly using the script in the root of the app and looking at the generated screenshot.

Looking over the debug output from poltergeist, I notice a reset() method is getting called but I don't see that in the PhantomJS 1.7 API. Should close() be called instead? Or is it possible the PhantomJS page object is getting used twice by mistake?

@jonleighton - any insights here? I know you don't have easy access to OSX -- I can try running some tests for you so we can properly report bugs upstream if necessary.

the repo is here: https://github.com/goosetav/true_type_bug

output from rspec (with poltergeist debug output) is here: https://gist.github.com/4004813

@jonleighton
Owner

Perhaps someone can submit a PR to add an explanation of this to the troubleshooting section of the README?

I am hoping that the WebKIt updates in Qt 4.8.3 might fix this problem, but we'll have to wait and see when PhantomJS upgrades to that (it's currently on 4.8.2).

@mjtko mjtko referenced this issue from a commit
Commit has since been removed from the repository and is no longer available.
@mjtko mjtko referenced this issue from a commit in mjtko/poltergeist
@mjtko mjtko add notes to troubleshooting section relating to PhantomJS crashes un…
…der OS X when using TTF fonts with @font-face declarations (see teampoltergeist/poltergeist#44).
1c79d02
@mjtko

Let me know if you think they need to be clearer and I'll modify and squash.

@tsgautier

I seem to be having a very similar issue occurring on my centos 6 machine that is acting as my build server (running jenkins). Running visit just once from cucumber works, but running twice always fails with the exact same error listed here.

If anyone would like my puppet recipe that gets my centos machine in shape maybe they could load it up on a Vagrant box and try it out?

My app is using bootstrap, but I looked through the css and didn't see any reference to a TT font.

Strangely enough, it works fine on OS X for me.

I'm installing PhantomJS 1.7.0 in both cases.

@tsgautier

Some more detail - as someone previously said, this really feels like a poltergeist issue not a PhantomJS issue.

This does not work:

Scenario: Viewing products

Given I am on the products page
Then I should see products
And one product is set as default

Scenario: Click on a product

Given I am on the products page
When I click on a product
Then I should see a list of rate plans

However, this does work:

Scenario: Viewing products

Given I am on the products page
Then I should see products
And one product is set as default

Given I am on the products page
When I click on a product
Then I should see a list of rate plans

Note that it is the "Given I am on the products page" step which fails when two scenarios are defined, this step is pretty basic, it's implemented as:

Given /^I am on the products page$/ do
    visit('/products')
end
@jonleighton
Owner

@tsgautier sounds like a different issue if there is no TTF font. do you have a crash dump? if so please open a separate issue and provide the dump.

@tgaff

@tsgautier I think I have the same CentOS issue. The font disabling solution in goosetav's gift does not resolve it.
I filed it separately as #200. #200

@wmilesn

+1 Also saw Capybara crashing on OSX after adding @font-face file referencing .ttf. Commented out the .ttf and worked again.

@jonleighton
Owner

I've upgraded the version of Qt bundled with PhantomJS in ariya/phantomjs#367.

Could somebody on OS X who is affected by this bug please try building it to see if this fixes the problem? I have no idea if it will, but it's possible that the bug has been fixed in the newer Qt/WebKit version.

For build instructions see http://phantomjs.org/build.html. You need to checkout my branch, obviously.

@mjtko

Ok, I've kicked off the build. Will get back to you in, well, a short while once it's built. :smile:

@goosetav
@mjtko

No joy I'm afraid, looks like it's still dying on TTFs. :cry:

@jonleighton
Owner

Ok, thanks for testing. It sounds like there is a plan to update to a newer version of WebKit in the next release. It's not happening this release because it will be tricky to do. But that may solve the problem if/when it happens.

@mjtko

No problem, thanks for keeping us posted and for the Qt upgrade regardless!

@goosetav

yep, same results. output from a failing spec can be found here: https://gist.github.com/4004813

crash dump is in this repo: https://github.com/goosetav/true_type_bug/tree/master/crash-dump

@marcelloma

Im experiencing the same problems, both with capybara-webkit and poltergeist.

Using capybara-webkit with qt 4.8.3 also did not seem to fix the issue, so that update does not fix that I think.

@marcelloma

Tested capybara-webkit using qt 4.8.4 built from source now and had the same issues.
So I think 4.8.4 may not be a fix for phantom js too.

=(

@ariya

Is there any simplistic PhantomJS example which reproduce the issue? Perhaps just by loading a particular web page someone has crafted to crash it?

@jonleighton
Owner

Can someone help ariya repro the issue? https://code.google.com/p/phantomjs/issues/detail?id=690#c9

@samgranieri
@goosetav
@ariya

@goosetav If that's available, it will significantly help my direct PhantomJS debugging!

@goosetav

i just committed a couple scripts that will reproduce the crash directly from PhantomJS to https://github.com/goosetav/true_type_bug

running phantomjs crash-phantom.js reproduces the bug

I also added a version of poltergeist's javascripts that disables the websocket and sends the commands directly. This may be generally useful for debugging poltergeist/phantomjs directly from the phantomjs cli -- I used this to track down the call sequence inside of poltergeist necessary to reproduce the crash

(cross posting to https://code.google.com/p/phantomjs/issues/detail?id=690 as well)

@panozzaj panozzaj referenced this issue in thoughtbot/capybara-webkit
Closed

I still get WebkitNoResponseError #181

@goosetav

FYI - see last comments in http://code.google.com/p/phantomjs/issues/detail?id=690

Probable fix coming for this bug in PhantomJS 1.8.1

@ariya

PhantomJS 1.8.1 is out: https://groups.google.com/d/topic/phantomjs/VhPYwDoEcc4/discussion.

Please have a look and verify that this does not cause the crash anymore. Thank you!

@HuffMoody

Verified. This does indeed fixed the problem.

@walski

weeeeeeeeeeeeeeeeee :boom: :clap: :dancers: :tada: Awesome!

@pfleidi

Unfortunately, upgrading to phantomJS 1.8.1 didn't fix my problem.

I still get DeadClient errors every time I run this code:

  within(:css, "form#node-type-form") do
    fill_in("name", :with => content_type)
    fill_in("description", :with => description)
    click_button("edit-submit")
  end

The shell output using Ruby 1.8, Cucumber, Capybara (1.1.3), Poltergeist (1.0.2) and PhantomJS 1.8.1 looks like this:

      The PhantomJS client died while processing {"args":[2,3],"name":"click"} (Capybara::Poltergeist::DeadClient)
      (eval):2:in `send'
      (eval):2:in `click_button'
      ./features/step_definitions/content_creation_steps.rb:17
      ./features/step_definitions/content_creation_steps.rb:14:in `/^I create a content type named ["']([^"']+)["'] with description ["']([^"']+)["']$/'
      features/fivestar.feature:24:in `And I create a content type named "fivestar-01" with description "fivestar type"'

Here's a crashdump of phantomJS I obtained after it failed.

Update:

After setting the debug setting to true, I found out that a JS error is thrown:

  options = {
    :js_errors => false,
    :window_size => [1280, 768],
    :debug => true
  }
{"args"=>["http:/my.site/path"], "name"=>"visit"}
{"error"=>{"args"=>[[{"stack"=>"TypeError: 'undefined' is not an object (evaluating 'jQuery.timeago.settings')\n    at http://my.site/sites/all/modules/timeago/timeago.js?mgexlw:13", "message"=>"TypeError: 'undefined' is not an object (evaluating 'jQuery.timeago.settings')"}]], "name"=>"Poltergeist.JavascriptError"}}
Capybara::Poltergeist::JavascriptError
{"args"=>[".//body[contains(concat(' ', @class, ' '), ' logged-in ')]"], "name"=>"find"}
{"response"=>{"ids"=>[0], "page_id"=>1}}

It looks like the problem is gone after fixing it.

@ariya

@pfleidi Your stack trace has not indicated the same TrueType font problem. However, if that still happens (again), feel free to open a new issue.

@pfleidi

@ariya Thanks. Here's the new issue: #232

@jonleighton
Owner

This is fixed by PhantomJS 1.8.1. Closing.

@mackermedia mackermedia referenced this issue in ariya/phantomjs
Closed

Crashes on OSX - v1.9.0 #11221

@konklone konklone referenced this issue in EFForg/phantom-of-the-capitol
Closed

PhantomJS client died while processing #9

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Something went wrong with that request. Please try again.