hook for dashboard show_user_profile

show_user_profile is the wrong hook to use. You should redirect before anything gets sent to the browser (eg. before headers are sent).

Fortunately there are actions that happen much earlier: load-{$pagename} is the one you want. So you can hook into load-index.php and load-profile.php to throw people back to the front end.

<?php
add_action( 'load-profile.php', 'wpse35742_maybe_redirect' );
add_action( 'load-index.php', 'wpse35742_maybe_redirect' );
function wpse35742_maybe_redirect()
{
    if( current_user_can( 'manage_options' ) ) return;
    wp_redirect( home_url( '/profile' ), 302 );
    exit();
}

All that said, you would be better off adding a new role that has even more limited capabilities than the typical subscribers: don’t let them view the dashboard or their profiles (the read capability).