GNU `ddrescue` first quickly copies good blocks using a large block size and then optionally tries to recover more data reading smaller blocks within the blocks that failed in the first pass. This requires a log file that records what areas are still missing and the output must go to a file or disk that allows random access. If run again with the log file present, `ddrescue` will try again reading the missing parts only.
Kurt Garloff's `dd_rescue` copies the data in sequential order, allowing it to be captured on stdout, e.g. to compress it before writing it to a file. When a read error is encountered `dd_rescue` switches temporarily to a smaller block size to try to recover data from the problematic area before continuing with the remainder of the disk.