quda

quda

How to debug a long error stack?

How to debug, in general, an error stack like this one (bellow) ?
It’s mixed with errors coming from the Erlang dependencies. Notice it doesn’t point to a certain line of my (Elixir) code.

Where to start from, what is the error source, error initiator, errors flow? How to read it, from bottom to top or top to bottom?

[error] Ranch listener "qwerty" had connection process started with :cowboy_clear:start_link/4 at #PID<0.489.0> exit with reason:
 {
    :badarg,
    [
        {
            :erlang,
            :iolist_size,
            [
                {
                    :EXIT, #PID<0.487.0>,
                    :shutdown
                }
            ],
            [error_info: %{module: :erl_erts_errors
                }
            ]
        },
        {
            :cow_ws,
            :payload_length,
            1,
            [file: '.../deps/cowlib/src/cow_ws.erl', line: 725
            ]
        },
        {
            :cow_ws,
            :frame,
            2,
            [file: '.../deps/cowlib/src/cow_ws.erl', line: 666
            ]
        },
        {
            :cowboy_websocket,
            :websocket_send,
            2,
            [file: '.../deps/cowboy/src/cowboy_websocket.erl', line: 626
            ]
        },
        {
            :cowboy_websocket,
            :handler_call,
            6,
            [file: '.../deps/cowboy/src/cowboy_websocket.erl', line: 542
            ]
        },
        {
            :cowboy_http,
            :loop,
            1,
            [file: '.../deps/cowboy/src/cowboy_http.erl', line: 257
            ]
        },
        {
            :proc_lib,
            :init_p_do_apply,
            3,
            [file: 'proc_lib.erl', line: 226
            ]
        }
    ]
}

Thanks! :smiley:

Most Liked

kartheek

kartheek

I would start from top to bottom as this is a stack trace - look at what the exact error is and then check what data is being passing to library calls.

Error at this line (most likely as I don’t know your library versions) - matches your stack trace:

It has something to do with Payload length or indirectly Payload itself?

Little more context about the app would help - is this phoenix app or elixir app with cowboy web sockets ? What versions of libraries you are using?

al2o3cr

al2o3cr

Start from the top - this is the root cause of the error - :erlang.iolist_size/1 is raising :badarg. The most common cause of this is passing something in that’s not the right shape.

The next two frames for :cow_ws.payload_length and :cow_ws.frame aren’t particularly interesting.

The frame for :cow_ws.websocket_send gives us another piece of information: we’re trying to send whatever the badly-shaped data is down a websocket

But the really important one is the frame after that: :cow_ws.handler_call. This is the “brains” of the websocket handler:

This is why the stack doesn’t have any application code in it - the application code is called in the first part of handler_call, and then the result of that is what’s being handled when the crash happens.

Check your code that’s sending data via websockets; has a stray {:ok, "data that should be sent"} snuck in someplace where you’re expecting just "data that should be sent"?

al2o3cr

al2o3cr

cowboy_websocket expects frames to match the cow_ws:frame type:

frame() :: {text, iodata()}
    | {binary, iodata()}
    | ping | {ping, iodata()}
    | pong | {pong, iodata()}
    | close | {close, iodata()} | {close, close_code(), iodata()}

close_code() :: 1000..1003 | 1006..1011 | 3000..4999

{:ok, "{\"some\":\"json data\"}"} is none of those, and it’s not an iodata either - so an error occurs.

I can’t offer you any shortcut - if you’re going to write code that interfaces with Erlang libraries (like cowboy_websocket) you’re going to need to learn some Erlang.

LostKobrakai

LostKobrakai

The comparison is a bit off. It‘s more like Scala and Java. Both run on the JVM and can interop with each other. If you depend from a Scala project on a Java library you’re better off knowing Java as well.

I also found that erlang becomes easier and easier to read with getting to know elixir.

cmo

cmo

I mean learn to love it for your own satisfaction in life. It’s not going to split from Erlang and life is too sweet to worry about things out of your control.

And yes your analogy is off. You are largely freed from writing C by the Erlang team, who are writing it for you.

Where Next?

Popular in Questions Top

sergio
In Ruby, I can go: User.find_by(email: "foobar@email.com").update(email: "hello@email.com") How can I do something similar in Elixir? ...
New
aalberti333
As the title describes, I’m trying to run Enum.map() over a list of key/value pairs, where the value is a map. My data looks like this: ...
New
_russellb
I want to try my hand at web scraping. What tools/libraries do I need to use. I’m hoping to turn this into something professional so don’...
New
fireproofsocks
I’m working on defining a simple Ecto schema for a table (in PostGres), but I don’t see where I can define a column as NOT NULL. Conside...
New
vertexbuffer
Hello, can anybody help here..? I have a list of players and I what to delete an element, but every for loop the list is reverting to ori...
New
ashish173
I am using Ecto timestamps with postgres, I can see the timestamps() use the :naive_dateime but for my use case I wanted to store the ti...
New
baxterw3b
Hi guys, i’m new in the Elixir world, and i have to say, that i love it! i’m having some problem to understand anonymous functions with ...
New
chewm
Hi guys, nice to meet you to the whole forum, I’m new here, I’m trying to configure visual studio code for elixir, right now the intellis...
New
hpopp
To simplify some tasks at work, I wrote and published this package yesterday. It’s a simple macro that enables Access behaviour on struct...
New
9mm
I am constructing a JSON object (map) and I need to conditionally set a field. I’m trying to write proper elixir-way code… and I’m at a l...
New

Other popular topics Top

Qqwy
Update: How to use the Blogs &amp; Podcasts section You can post links to your blog posts or podcasts either in one of the Official Blog...
3268 119930 1237
New
Brian
What is the proper way to load a module from a file in to IEX? In the python world, doing something like this pretty standard: from ....
New
sorentwo
Hello! tl;dr Announcing Oban, an Ecto based job processing library with a focus on reliability and historical observability. After spen...
977 41022 311
New
AstonJ
You’re a programmer, so you don’t need spoon feeding with the conventional drivel about “this is an integer.” No. You need to know what’s...
New
fireproofsocks
I’m working on defining a simple Ecto schema for a table (in PostGres), but I don’t see where I can define a column as NOT NULL. Conside...
New
vertexbuffer
Hello, can anybody help here..? I have a list of players and I what to delete an element, but every for loop the list is reverting to ori...
New
beno
I will often find my self writing things similar to: case some_value do nil -&gt; something() "" -&gt; something() _ -&gt; someth...
New
Qqwy
Original source of discussion: This topic on the Pragmatic Programmers' Functional Web Development with Elixir, OTP, and Phoenix forum. ...
New
AstonJ
by Lance Halvorsen Elixir and Phoenix are generating tremendous excitement as an unbeatable platform for building modern web application...
460 27162 124
New
lanycrost
Hi everyone! I need implement if…else if…else condition from my elixir code, and anymore of this control flow structures not work proper...
New

We're in Beta

About us Mission Statement